Как обновить просмотр списка после вызова Asynctask для вызова веб-службы - PullRequest
2 голосов
/ 03 августа 2011

Я звоню от webservice до asynctask, чтобы вызвать webservice Я вызываю один метод с именем makeRequest() в doInBackground(), я получаю ответ в других методах success(), В методе успехая обновляю listview

Но я получаю сообщение об ошибке вроде

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."

Здесь я добавляю свой код. Я звоню synctask из активности

new MyTask(this,urlAsString,sp).execute(); 

вот класс 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();
          }
        }

Здесь я получаю webservice ответ

 public void success(Object result) {

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

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

listview не обновляется и показывает ошибку

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Справкамне решить эту проблему ...

Ответы [ 3 ]

19 голосов
/ 03 августа 2011

Вы должны обновить свой список следующим образом.

Activity_name.this.runOnUiThread(new Runnable() {

@Override
public void run() {
      list = (ArrayList<Map<String, String>>) result;
      this.adapter.setList(list);
      this.adapter.notifyDataSetChanged();
    }
});
5 голосов
/ 03 августа 2011

Так как эта ошибка возникает при выполнении задачи MainThread в другом потоке .....

попробуйте это:

runOnUiThread(new Runnable(){

public void run(){

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

});

В этом коде могут быть некоторые ошибки. Но простыми словами ... добавьте вызов notifyDataSetChanged в метод runOnUiThread (). Вам будет сделано ..

ИЛИ это также можно сделать (идеальный способ)

добавить следующее в ваш класс активности

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

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

Вызывайте этот обработчик, когда и где вы хотите вызвать notifydatasetchange, как это

  handler.sendEmptyMessage(0);

Спасибо Shah

4 голосов
/ 03 августа 2011

вызов метода успеха для метода onPostExecute

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...