Я прочитал и просмотрел все возможные учебники по кэшированию изображения, но не смог найти решение для этого. Я использую 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() вызывает задачу, так как растровые изображения в кэше являются недействительными. Еще раз спасибо
Если вы хотите показать изображения в виде сетки, как было упомянуто, вы можете использовать ниже библиотеки для эффективного решения: https://github.com/nostra13/Android-Universal-Image-Loader –
Волейбол Google уже имеет все необходимое для достичь этого без необходимости использования асинхронных задач. Взгляните на эту ссылку https://developer.android.com/intl/ru/training/volley/request.html#request-image –
@himanshumunjal Я не хочу использовать библиотеки, я считаю, что есть небольшой трюк, отсутствующий –