2015-07-14 3 views
0

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

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

2-in asynctask im сохраняет загруженное растровое изображение в кеш. НО Кэш всегда пуст, поэтому растровые изображения не сохраняются. Я отправляю свой адаптер и асинтет. Примечание: я использовал точный учебник для разработчиков Android

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html#config-changes заранее спасибо

public class FragmentCellAdapter extends BaseAdapter { 
     public FragmentCellAdapter(Context context,String json,int test){ 
    mcontext=context;  
    this.Json = json; //something i use in my code 

    s = test; 

    try { 
     this.jsonArray = new JSONArray(json); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024); 
// Use 1/8th of the available memory for this memory cache. 
final int cacheSize = maxMemory/8; 
    Log.e("maxMemory and cach is ",""+maxMemory +" "+ cacheSize); 

    memoryCache = new LruCache<String,Bitmap>(cacheSize){ 
     @Override 
     protected int sizeOf(String key, Bitmap value) { 
      Log.e("size of returns "," " + bitmap.getByteCount()/1024); 
      return bitmap.getByteCount(); 
     } 
    }; 

} 


     @Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public Object getItem(int position) { 
    Log.e("calling get item of grid adpter","at position " + position); 
    return null; 
} 

@Override 
public int getCount() { 
    return jsonArray.length(); 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view; 


     view = inflater.inflate(R.layout.listfragmentcell,null); 
     cellIm = (ImageView) view.findViewById(R.id.cellimage2); 
      final Bitmap bitmap1 = getBitmapFromMemCache(imgurl); 
      if (bitmap1 == null){ 
       new LoadImage(cellIm,b).execute("http://restaurantapp.azurewebsites.net/images/menuItems/"+image); 
       Log.e("null bitmap calling task at position ", + position+  " is : " +"http://restaurantapp.azurewebsites.net/images/menuItems/"+image); 

       } 
      else { 

       cellIm.setImageBitmap(bitmap1);Log.e("bitmap found in ","        cache") ;} 
     return view; 
    } 

     public void addBitmapToMemoryCache(String key, Bitmap bitmap) { 
    if (getBitmapFromMemCache(key) == null) { 
    Log.e("adding image url",key); 
    memoryCache.put(key, bitmap); 
    } 
    } 
    public Bitmap getBitmapFromMemCache(String key) { 
    if (memoryCache.get(key) == null){Log.e("null at key",key);} 
    return memoryCache.get(key); 
    } 


     public class LoadImage extends AsyncTask<String,Void,Bitmap>{ 

    WeakReference<ImageView> imageViewReference; 
    WeakReference<ProgressBar> pbar; 

    public LoadImage (ImageView im) { 
     this.imageViewReference = new WeakReference<ImageView>(im); 
     // this.pbar = new WeakReference<ProgressBar>(bar); 
    } 


    @Override 
    protected Bitmap doInBackground(String... params) { 

     try { 

      URL url = new URL(params[0]); 

      HttpURLConnection connection = (HttpURLConnection)   url.openConnection(); 

      int responsecode = connection.getResponseCode(); 
      Log.e("code of res"," " + responsecode); 
      if (responsecode == HttpStatus.SC_OK){ 
      InputStream in = connection.getInputStream(); 

      bitmap = BitmapFactory.decodeStream(in); 

      Matrix matrix = new Matrix(); 
      matrix.postScale(50,50); 
      resizedBitmap = Bitmap.createBitmap(bitmap,0,0,100,150); 

      // adding bitmaps to the cache 
      addBitmapToMemoryCache(String.valueOf(url),resizedBitmap);} 
      else {Log.e("response code ",responsecode + "");} 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     return resizedBitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmapp) { 
     super.onPostExecute(bitmapp); 

     ImageView imageView = imageViewReference.get(); 
     ProgressBar bar = pbar.get(); 

     if (imageView != null){ 
      bar.setVisibility(View.GONE); 
      imageView.setImageBitmap(bitmapp);} 

    } 

проблема каждый раз GetView() вызывает задачу, так как растровые изображения в кэше являются недействительными. Еще раз спасибо

+0

Если вы хотите показать изображения в виде сетки, как было упомянуто, вы можете использовать ниже библиотеки для эффективного решения: https://github.com/nostra13/Android-Universal-Image-Loader –

+0

Волейбол Google уже имеет все необходимое для достичь этого без необходимости использования асинхронных задач. Взгляните на эту ссылку https://developer.android.com/intl/ru/training/volley/request.html#request-image –

+0

@himanshumunjal Я не хочу использовать библиотеки, я считаю, что есть небольшой трюк, отсутствующий –

ответ

0

Я знал проблему после добавления журналов:

1-й: учебник обеспечивает разработчиками Android создает денежные средства в размере около 8000 байт, который слишком мал для хранения растровых изображений.

поэтому я изменил размер до 4mb или 4 * 1024 * 1024, который может хранить приличное количество растровых изображений в соответствии с их собственным размером. Вы можете установить любой размер, но вы должны проверить, что размер LRUCache намного больше, чем значение, которое вы получаете от метода sizeOf, который дает размер каждой записи. Таким образом вы можете рассчитать приблизительные числа растровых изображений, которые может хранить ваш кеш.

+0

также избегайте использования библиотек, которые только делают ваше приложение более тяжелым, особенно для таких мелочей –

2

Не изобретайте велосипед. Создание библиотеки кеширования вообще не является тривиальной задачей. Используйте уже разработанную библиотеку (Picasso, Glide) или, по крайней мере, прочитайте источники.

+0

снова я не хочу использовать какую-либо библиотеку, все работает отлично, но что-то отсутствует в кешировании –

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