2015-08-05 1 views
9

Я работаю над приложением android, которое извлекает изображение из Интернета и отображается в пользовательском интерфейсе. Я использую RecyclerView для показа изображения. Я планирую загрузить изображение, используя отдельный поток. и обновить RecyclerView через обработчик. Я не знаю, кастрированный баран это понятие является правильным или нет, (я знаю AsyncTask, но для учебных целей я пытаюсь реализовать обработчик.) Я кодируются так же, как нижеИспользование обработчика для публикации в пользовательском интерфейсе

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(); 

    } 

Я выполнил это код, но я получаю ошибку, и приложение прекращено, я не знаю, почему это происходит. пожалуйста, помогите мне разобраться. и объясните, в чем проблема для текущего кода.

(Пожалуйста, не предлагают использовать AsyncTask (я попробовал это, и это работает отлично))

UPDATE

Ошибка при получении: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

+0

пожалуйста, обновите дп – droidev

ответ

15

Ваше приложение становится прекращено из-за вы вызываете notifyDataSetChanged() из неинтерфейса.

Заменить:

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

с этим:

new Handler(Looper.getMainLooper()).post(new Runnable() { // Tried new Handler(Looper.myLopper()) also 
        @Override 
        public void run() { 
         mAdapter.notifyDataSetChanged(); 
        } 
       }); 
+1

, что звучит хорошо, но то, что разница между Looper.getMainLooper() и Looper.myLooper()? – droidev

+2

Looper.getMainLooper() получает основной петлевой механизм приложения, тогда как Looper.myLooper() возвращает Looper, связанный с текущим потоком. refere: http://developer.android.com/reference/android/os/Looper.html –

1

Нить вы определили не имеет Looper, и нет очереди сообщений, так что вы не можете отправить сообщение в этой теме. AsyncTask имеет свой собственный Looper, который вы можете найти в исходном коде. Это обработчик определяется в AsyncTask:

private static class InternalHandler extends Handler { 
    public InternalHandler() { 
     super(Looper.getMainLooper()); 
    } 

    @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"}) 
    @Override 
    public void handleMessage(Message msg) { 
     AsyncTaskResult<?> result = (AsyncTaskResult<?>) msg.obj; 
     switch (msg.what) { 
      case MESSAGE_POST_RESULT: 
       // There is only one result 
       result.mTask.finish(result.mData[0]); 
       break; 
      case MESSAGE_POST_PROGRESS: 
       result.mTask.onProgressUpdate(result.mData); 
       break; 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^