2013-09-30 3 views
1

Я загружаю строку JSON, содержащую URL-адрес изображения фонового изображения. Код загрузки находится внутри 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() 

Где я неправ?

ответ

1

Переместите код ImageLoader в onPostExecute вашей asyncTask. Вы не можете создать обработчик в любом потоке (ImageLoader нуждается в обработчике, я полагаю). Вам нужен поток с петлителем и вызываемый Looper.prepare(). Темы AsyncTask не имеют петлителя. Поэтому переместите код в onPostExecute, чтобы запустить его в основном потоке.

0

Вы ошибаетесь в том месте, где вы пытаетесь создать обработчик из рабочего потока, который не вызвал Looper.prepare(), возможно, вы даже не намеренно делали это, однако существует множество методов создания обработчиков чтобы модифицировать представления, обычно эти обработчики присоединяются к основному потоку пользовательского интерфейса, однако очень вероятно, что вы вызываете метод, пытающийся создать обработчик из рабочего потока. Если это так, вам нужно сделать это, вызвав этот метод из главный пользовательский интерфейс, но убедитесь, что он не затормозит ваш пользовательский интерфейс, если это так, создайте свой собственный обработчик и выполните его, как только вы закончите, или вызовите метод runOnUIThread, если вы находитесь в действии, когда это необходимо ...

Надежда это помогает.

С уважением!

0

Попробуйте с этим.

  runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mainLayout.setBackgroundDrawable(d); 
       } 
      }); 
Смежные вопросы

 Смежные вопросы