无法在线程内创建处理程序

时间:2013-09-30 19:23:56

标签: android multithreading

我下载了一个包含View背景图片网址的JSON字符串。下载代码位于doInBackground(Object... params)内。对于加载图像,我使用的是Universal Image Loader。

ImageLoader.getInstance().loadImage(shop.background, new ImageLoadingListener() {

    public void onLoadingStarted(String imageUri, View view) {
        // TODO Auto-generated method stub
    }

    public void onLoadingFailed(String imageUri, View view, 
            FailReason failReason) {
        // TODO Auto-generated method stub
    }

    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // TODO Auto-generated method stub
        Drawable d = new BitmapDrawable(getResources(),loadedImage);
        mainLayout.setBackgroundDrawable(d);
    }

    public void onLoadingCancelled(String imageUri, View view) {
        // TODO Auto-generated method stub
    }
});

我正在

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

我哪里错了?

3 个答案:

答案 0 :(得分:1)

将ImageLoader的代码移动到asyncTask的onPostExecute。你不能在任何线程中创建处理程序(ImageLoader需要一个我想的处理程序)。你需要一个带有looper的线程并调用Looper.prepare()。 AsyncTask的线程没有looper。所以将代码移动到onPostExecute以在主线程上运行它。

答案 1 :(得分:0)

你试图从没有调用Looper.prepare()的工作线程创建一个处理程序是错的,也许你甚至没有故意这样做,但是有很多方法可以创建处理程序为了修改视图,通常这个处理程序附加到主UI线程,但很可能你正在调用一个试图从工作线程创建处理程序的方法,如果是这样,你要做的是,从main调用该方法用户界面,但要确保它不会冻结你的用户界面,如果是这样的话就创建你自己的处理程序并在完成后执行它,或者如果你在需要的时候调用runOnUIThread方法...

希望这有助于。

问候!

答案 2 :(得分:0)

试试这个。

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mainLayout.setBackgroundDrawable(d);
                }
            });