Android 在异步任务中更新ListView

Android 在异步任务中更新ListView,android,listview,android-asynctask,Android,Listview,Android Asynctask,我想创建ListView,它每4秒添加一个项目,并将焦点设置在最后一个项目上。 问题是,我的片段等待asynctask结束,然后才显示出来(asynctask始终在白色屏幕上工作) 公共类日志片段扩展了SherlockFragment{ 私有列表视图lvList; 专用阵列适配器; 私有更新任务mTask=null; 字符串[]值=新字符串[]{“Android”、“iPhone”、“WindowsMobile”}; @凌驾 创建视图上的公共视图(布局、充气机、视图组容器、, Bundle sa

我想创建ListView,它每4秒添加一个项目,并将焦点设置在最后一个项目上。 问题是,我的片段等待asynctask结束,然后才显示出来(asynctask始终在白色屏幕上工作)

公共类日志片段扩展了SherlockFragment{
私有列表视图lvList;
专用阵列适配器;
私有更新任务mTask=null;
字符串[]值=新字符串[]{“Android”、“iPhone”、“WindowsMobile”};
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.log\u碎片,容器,假);
lvList=(ListView)view.findViewById(R.id.lvLog);
最终ArrayList=新ArrayList();
对于(int i=0;i
和任何任务-

 public class UpdateTask extends AsyncTask<Void, Void, Void> {
        int temp = 10;

        protected Void doInBackground(Void... params) {
            getSherlockActivity().runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    while (temp-- > 0) {
                        try {
                            TimeUnit.SECONDS.sleep(4);
                            adapter.add("Lol" + String.valueOf(temp));
                            lvList.setSelection(lvList.getAdapter().getCount() - 1);
                            Log.d("myLogs", "Added from Async");
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            });

            return null;

        }

        protected void onPostExecute(String result) {
            // Add code that loops through JSONArray and adds to adapter here

        }
    }
公共类UpdateTask扩展异步任务{
内部温度=10;
受保护的Void doInBackground(Void…参数){
getSherlockActivity().runOnUiThread(新的Runnable()命令){
@凌驾
公开募捐{
同时(临时-->0){
试一试{
时间单位。秒。睡眠(4);
adapter.add(“Lol”+字符串.valueOf(temp));
lvList.setSelection(lvList.getAdapter().getCount()-1);
Log.d(“myLogs”,“从异步添加”);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
});
返回null;
}
受保护的void onPostExecute(字符串结果){
//在这里添加循环通过JSONArray并添加到适配器的代码
}
}
如何解决我的问题?

调用以更新适配器中的数据,这将更新ListView中显示的内容。此外,从doInBackground调用runOnUiThread是一个坏主意,该方法设计用于执行UI线程之外的所有繁重工作,而onPostExecute设计用于在任务完成后对UI进行更改执行……我建议如下:

protected Void doInBackground(Void... params) {
    TimeUnit.SECONDS.sleep(4);
    adapter.add("Lol" + String.valueOf(temp));
    Log.d("myLogs", "Added from Async");
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

protected void onPostExecute(String result) {
    // Add code that loops through JSONArray and adds to adapter here
    lvList.setSelection(lvList.getAdapter().getCount() - 1);
    adapter.notifyDataSetChanged();
}

如果没有rununui,它将无法工作(只有创建视图层次结构listview的原始线程可以触摸…)。我希望看到逐位添加的结果,而不是一次添加所有字符串。我编辑了我的答案,并将调用移动到onPostExecute中的setSelection。
protected Void doInBackground(Void... params) {
    TimeUnit.SECONDS.sleep(4);
    adapter.add("Lol" + String.valueOf(temp));
    Log.d("myLogs", "Added from Async");
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

protected void onPostExecute(String result) {
    // Add code that loops through JSONArray and adds to adapter here
    lvList.setSelection(lvList.getAdapter().getCount() - 1);
    adapter.notifyDataSetChanged();
}