2015-08-05 16 views
9

Internet'ten görüntü alıp kullanıcı arabiriminde gösterilen bir android uygulaması üzerinde çalışıyorum. Resmi göstermek için RecyclerView kullanıyorum. Görüntüyü ayrı bir iş parçacığı kullanarak indirmeyi planlıyorum. ve işleyici aracılığıyla RecyclerView'ı güncelleyin. Bu kavram doğru ya da değil, Ben de bu idamİşleyiciyi UI'ye İletmek İçin Kullanın

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

    } 

altında aynı için kodlanmış (I AsyncTask biliyorum ama amacını öğrenmek için ben Handler uygulamak çalışıyorum.) Hava ben bilmiyorum kod ama hata alıyorum ve uygulama sonlandırıldı, bunun neden olduğunu bilmiyorum. lütfen herhangi biri bana yardım etmek için yardım edin. ve mevcut kod için problemin ne olduğunu açıklar.

(AsyncTask kullanmayı önermiyoruz Lütfen (Ben denedim ve gayet iyi çalışıyor))

GÜNCELLEME

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

+0

iyi geliyor qn – droidev

cevap

15

Başvurunuz çünkü sonlandırıldı oluyor non UI Thread'den notifyDataSetChanged() öğesini çağırıyorsunuz. Eğer tanımlanan

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

yeniden lütfen ama sonra Looper.getMainLooper() ve Looper.myLooper() arasındaki fark nedir: Bu AsyncTask eylemci tanımlanır? – droidev

+2

Looper.getMainLooper(), Looper.myLooper() geçerli iş parçacığı ile ilişkili Looper'ı döndürürken Looper.getMainLooper() uygulaması ana looperi alır. refere: http://developer.android.com/reference/android/os/Looper.html –

1

iplik bir ilmek cihazı yok ve hiçbir mesaj kuyruğu, bu yüzden bu thread mesaj gönderilemez: Bununla

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

:

değiştirin. AsyncTask, kendi kaynak kodunda bulabileceğiniz kendi Looper'ına sahiptir.

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; 
     } 
    } 
} 
İlgili konular