如何在调用Asynctask调用webservice后更新listview

Aju*_*Aju 2 android android-asynctask

我打电话一webserviceasynctask,打电话给webservice我打电话的一种方法命名makeRequest()doInBackground(),我得到另一种方法的响应success(),在成功的方法,我更新listview

但我得到的错误就像

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."
Run Code Online (Sandbox Code Playgroud)

我在这里添加我的代码.我synctask从活动中调用

new MyTask(this,urlAsString,sp).execute(); 
Run Code Online (Sandbox Code Playgroud)

这是Asynctask类

class MyTask extends AsyncTask<Void, Void, Void> {
        ProgressDialog progress;

        String url;
        SharedPreferences sp;
        HomepageH2desk c;
          public MyTask(HomepageH2desk context,String url,SharedPreferences sp) {
            this.c = context;
            this.url = url;
            this.sp = sp;
            progress = new ProgressDialog(this.c);
            progress.setMessage("Loading...");
          }

          public void onPreExecute() {
            progress.show();
          }

          public Void doInBackground(Void... unused) {
             c.getTickets(url,sp);
            return null;
            //progress.setMessage("Loading...");
          }

          public void onPostExecute(Void unused) {
            progress.dismiss();
          }
        }
Run Code Online (Sandbox Code Playgroud)

我在这里得到webservice回应

 public void success(Object result) {

     list = (ArrayList<Map<String, String>>) result;

    this.adapter.setList(list);
            this.adapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

listview 没有得到更新并显示错误

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Run Code Online (Sandbox Code Playgroud)

帮我解决这个问题......

Lal*_*ani 19

您应该像这样更新您的列表.

Activity_name.this.runOnUiThread(new Runnable() {

@Override
public void run() {
      list = (ArrayList<Map<String, String>>) result;
      this.adapter.setList(list);
      this.adapter.notifyDataSetChanged();
    }
});
Run Code Online (Sandbox Code Playgroud)


Sha*_*hah 5

因为这是你在另一个线程中执行一些MainThread任务时出现的错误.....

试试这个:

runOnUiThread(new Runnable(){

public void run(){

     this.adapter.setList(list);
     this.adapter.notifyDataSetChanged();
   }

});
Run Code Online (Sandbox Code Playgroud)

此代码可能有一些错误但是在简单的单词中..将notifyDataSetChanged调用添加到runOnUiThread()方法中.你将完成..

或者这也可以是DOne(完美的方式)

在您的活动类中添加以下内容

 private Handler handler = new Handler() {
     @Override
     public void handleMessage(Message msg) {

        this.adapter.setList(list);
        adapter.setnotifyDataSetChanged();
     }
  };
Run Code Online (Sandbox Code Playgroud)

如下所示,在您想要调用notifydatasetchanged的时间和地点调用此处理程序

  handler.sendEmptyMessage(0);
Run Code Online (Sandbox Code Playgroud)

谢谢sHaH