AsyncTask在doInBackground中崩溃,添加到listview

时间:2012-02-23 22:45:58

标签: android multithreading listview crash android-asynctask

当我尝试在后台运行函数doTask()时,我崩溃了。我正在尝试使用新的Thread(new Runnable(){})并且它仅适用于此部分: handlerForBar.post(new Runnable(){public void run(){doTask();}}) 但是当doTask()的工作完成时,progressBar会出现。所以我认为AsyncTask可以工作,但它会崩溃。

  public void doTask() 
                {

                ListView listView = (ListView)findViewById(R.id.list);

                myArray = new ArrayList<HashMap<String,Object>>();
                HashMap<String, Object> hash_map;

                hash_map = new HashMap<String, Object>();
                hash_map.put(NICK_KEY, "nick");

                myArray.add(hash_map);
                listView.setAdapter(new myListAdapter(myArray,this));
                new myListAdapter(myArray,this).notifyDataSetChanged();
                }



private class myThread extends AsyncTask<String, Void, String> {

          @Override
          protected String doInBackground(String... params) {

              doTask(); //try, catch also FC
            return null;
          }

          ...
         }

* .java的结构:

> public class mainActivity extends Activity{}
>                       public void onCreate()
>                                  new myThread().execute("");    
>                       public void doTask()
>                       private class myThread extends AsyncTask<String, Void, String>{}
>                                  protected String doInBackground()
>                                                   doTask()
>                       private class myListView extends BaseAdapter

2 个答案:

答案 0 :(得分:2)

你无法在doInBackground方法中操纵ListView。而是在onPostExecute中执行此操作。简而言之,需要UI更新的所有操作都需要在UI线程上完成,而在AsyncTask中,它可以在后执行中使用

提示:在doInBackground中的适配器中插入项目,然后在onPostExecute中将其设置为list

答案 1 :(得分:2)

您无法触及doInBackground中的用户界面,您必须使用onProgressUpdateonPostExecute等方法更新用户界面。见here