使用处理程序发布到UI线程

dro*_*dev 9 multithreading android message-queue handler

我正在开发一个Android应用程序,它从Internet获取图像并在用户界面中显示.我正在使用RecyclerView来显示图像.我打算使用单独的线程下载图像.并通过处理程序更新RecyclerView.我不知道这个概念是否正确,(我知道AsyncTask,但出于学习目的,我正在尝试实现Handler.) 所以我的编码与下面相同

private void loadNewsThumbnailImage(ArrayList<DataItem> dataList) {
    for (DataItem item : DataList) { //DataItem is the model class
        loadThumbnailFromInternet(item);
        }
}



private void loadThumbnailFromInternet(final DataItem dataItem) {

        Thread imageDowloaderThread = new Thread(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = null;
                try {
                    bitmap = getDataItemBitmap(dataItem.getmImageUrl());
                    dataItem.setmThumbnail(bitmap);
                    new Handler().post(new Runnable() { // Tried new Handler(Looper.myLopper()) also
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        imageDowloaderThread.start();

    }
Run Code Online (Sandbox Code Playgroud)

我已执行此代码,但我收到错误,应用程序终止,我不知道为什么会发生这种情况.请任何人帮我解决一下.并解释当前代码的问题.

(请不要建议使用AsyncTask(我已经尝试过,它工作正常))

UPDATE

获取错误:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Sun*_*hah 20

您的应用程序将被终止,因为您从非UI线程调用notifyDataSetChanged().

更换:

 new Handler().post(new Runnable() { // Tried new Handler(Looper.myLopper()) also
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    }); 
Run Code Online (Sandbox Code Playgroud)

有了这个:

new Handler(Looper.getMainLooper()).post(new Runnable() { // Tried new Handler(Looper.myLopper()) also
                    @Override
                    public void run() {
                        mAdapter.notifyDataSetChanged();
                    }
                });
Run Code Online (Sandbox Code Playgroud)

  • Looper.getMainLooper()获取应用程序的主循环,而Looper.myLooper()返回与当前线程关联的Looper.参考:http://developer.android.com/reference/android/os/Looper.html (2认同)