2016-12-21 6 views
0

안녕하세요 위 코드를 사용하여 위젯 목록보기 항목에 이미지를로드했습니다. 유니버설 이미지 로더에서 SimpleImageLoadingListener를 사용하여 비트 맵 캐시를 사용하는 방법 android

Map<Integer, Boolean> flags = Collections.synchronizedMap(new HashMap<Integer, Boolean>()); 
    Bitmap mBitmap; 
    Handler handler = new Handler(Looper.getMainLooper()); 


flags.put(position, false); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        ImageLoader imageLoader = ImageLoader.getInstance(); 
        DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
          .cacheOnDisc(true).resetViewBeforeLoading(true) 
          .build(); 
        imageLoader.loadImage(item.mTooteet.getThumbUrl1() + "&userToken=" + userPreference.getUserToken(), options, 
          new SimpleImageLoadingListener() { 
           @Override 
           public void onLoadingStarted(String imageUri, View view) { 
            Log.d(TAG,"onLoadingStarted "+position); 
           } 

           @Override 
           public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
            Log.d(TAG,"onLoadingFailed "+position); 
            flags.put(position, true); 
           } 

           @Override 
           public void onLoadingCancelled(String imageUri, View view) { 
            Log.d(TAG,"onLoadingCancelled "+position); 
            flags.put(position, true); 
           } 

           @Override 
           public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap) { 
            Log.d(TAG,"onLoadingComplete "+position); 
            mBitmap = bitmap; 
            flags.put(position, true); 
           } 
          }); 
       } 
      }); 

      while (!flags.get(position)) { 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      flags.put(position, false); 
      if (mBitmap != null) { 
       Log.d(TAG,"onLoadingComplete mBitmap not null "+position); 
       remoteView.setImageViewBitmap(R.id.feed_image, mBitmap); 
      } else { 
       Log.d(TAG,"onLoadingComplete mBitmap null "+position); 
       remoteView.setImageViewResource(R.id.feed_image, R.drawable.app_icon); 
      } 
      mBitmap = null; 

그리고 내가 아래의 코드를 사용하고 내 응용 프로그램 파일에

,

// UNIVERSAL IMAGE LOADER SETUP 
     DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
       .cacheOnDisc(true).cacheInMemory(true) 
       .imageScaleType(ImageScaleType.EXACTLY) 
       .displayer(new FadeInBitmapDisplayer(300)).build(); 

     ImageLoaderConfiguration uilConfig = new ImageLoaderConfiguration.Builder(
       getApplicationContext()) 
       .defaultDisplayImageOptions(defaultOptions) 
       .memoryCache(new WeakMemoryCache()) 
       .discCacheSize(100 * 1024 * 1024).build(); 

     ImageLoader.getInstance().init(uilConfig); 
     // END - UNIVERSAL IMAGE LOADER SETUP 

하지만이 코드는 URL 매번에서 이미지를 다운로드합니다. 내 앱 위젯 목록보기를 스크롤 할 때마다 다시로드하고 싶지 않습니다. 처음 다운로드 한 후에는 캐시에 보관해야합니다. 이 일을 할 생각을 나에게 제안 해 주시겠습니까?

+0

귀하의 질문에 대한 해결책은 아니지만 [glide] (https://github.com/bumptech/glide)를 사용할 수없는 이유에 대한 제안입니다. 내 경우에 더 좋습니다. 나는 또한 희망을 품는다? – Raghavendra

+0

@Raghavendra 안녕하세요, 위와 같이 이미지보기에서 이미지를 설정할 수있는 widget을 사용하고 있습니다.이 remoteView.setImageViewBitmap (R.id.feed_image, mBitmap); 여기서 R.id.feed_image는 내 이미지보기 ID입니다. 위젯에서 글라이드 라이브러리를 사용하는 데 문제가 있습니다. 이런 위젯에서 글라이드를 사용하는 법을 아십니까? – Sangeetha

답변

0

코드에서 매번 DisplayImageOptions를 만듭니다. 나는이 (당신의 Runnable 오브제 외부) 이유는 를 사용하여 다음과 같이 한 시간 동안 DisplayImageOptions을 생각 :

다음
ImageLoader imageLoader = ImageLoader.getInstance(); 
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
         .cacheOnDisc(true).resetViewBeforeLoading(true) 
         .build() 

실행 가능한 내부에 다른 코드

handler.post(new Runnable() { 
      @Override 
      public void run() { 
       imageLoader.loadImage(..........)///same code you written 

} 

});

결과를 알려주십시오.

+0

나는 당신이 말한 것처럼 노력했습니다. 그러나 그것의 다시 다운로드. – Sangeetha

+0

유니버설 이미지 로더는 먼저이 imgUrl에 대한 캐시가 존재하는지 imgUrl로 캐시에서 확인합니다. 발견되면 캐시에서로드하고 그렇지 않으면 서버에서 다운로드하여 캐시합니다. 모든로드 후에 imageView에 이미지를 표시하는 데 걸리는 시간을 확인하십시오. 첫 번째로드에서 다음로드까지 시간이 다른 경우 캐시에서 이미지를로드해야합니다. – MdFazlaRabbiOpu

+0

@ MdFazlaRabbiOpu 몇 초가 걸립니다. 때로는 하나 이상의 명칭이 필요합니다. – Sangeetha