AsyncTask 在 doInBackground 中崩溃,添加到 listview

Posted

技术标签:

【中文标题】AsyncTask 在 doInBackground 中崩溃,添加到 listview【英文标题】:AsyncTask crashes in doInBackground, add to listview 【发布时间】:2012-03-14 10:10:26 【问题描述】:

当我尝试在后台运行函数 doTask() 时发生崩溃。我正在尝试使用 new 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

【问题讨论】:

【参考方案1】:

doInBackground 中的 UI 无法触摸,您必须在 onProgressUpdateonPostExecute 等方法中更新 UI。见here

【讨论】:

【参考方案2】:

您不能在doInBackground 方法中操作 ListView。而是在onPostExecute 中执行此操作。简而言之,所有需要 UI 更新的操作都需要在 UI 线程上完成,而在 AsyncTask 中它在 post execute 中工作

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

【讨论】:

以上是关于AsyncTask 在 doInBackground 中崩溃,添加到 listview的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask

AsyncTask

AsyncTask 替代背景图像下载? (AsyncTask ---------已弃用)

Android AsyncTask get()形成另一个AsyncTask()

Android面试Android异步任务AsyncTask

AsyncTask onCancelled(Object) 从未在 asyncTask.cancel(true) 之后调用;