从另一个线程更新主线程中的ListView

Wil*_*son 12 android

我有一个单独的线程来运行从互联网上获取数据.之后,我想通过调用adapter.notifyDataSetChanged()更新主线程中的ListView.但它不起作用.任何解决方法?谢谢.

Dam*_*ski 13

使用AsyncTask(http://developer.android.com/reference/android/os/AsyncTask.html).

onPostExecute(...)方法中调用adapter.notifyDataSetChanged().

有关详细信息,请阅读:http://android-developers.blogspot.com/2009/05/painless-threading.html


Yar*_*Yar 12

总的来说,好的建议是 http://android-developers.blogspot.com/2009/05/painless-threading.html

我个人使用自定义线程(扩展线程的类),但通过Message发送响应给UI线程.所以在线程的run()函数中有:

Message msg;
msg = Message.obtain();
msg.what = MSG_IMG_SET;                     
mExtHandler.sendMessage(msg);
Run Code Online (Sandbox Code Playgroud)

UI线程定义了一个消息处理程序.

private Handler mImagesProgressHandler;

public void onCreate(Bundle bundle) {

    mImagesProgressHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {             
            case LoadImagesThread.MSG_IMG_SET:
                mArrayAdapter.setBitmapList(mImagesList);
                mArrayAdapter.notifyDataSetChanged();
                break;
            case LoadImagesThread.MSG_ERROR:
                break;
            }
            super.handleMessage(msg);
        }
    };                 
Run Code Online (Sandbox Code Playgroud)

这实际上比AsyncTask更容易.

  • 小心 - 这里是龙!这个内部Handler类具有对外部类'this的隐式引用.最好使Handler静态并将WeakReference带到外层. (2认同)
  • @MichaelKrause,为什么这里有问题?处理程序的生命周期不会超过活动的生命周期 (2认同)

Jay*_*dri 9

或者,将消息发布到listview的消息队列(将在UI线程上执行):

list.post(new Runnable() {                  
    @Override
    public void run() {
       adapter.notifyDataSetChanged();

    }
}); 
Run Code Online (Sandbox Code Playgroud)