Las imágenes de gridview de Android en caché, en las imágenes de desplazamiento se repiten antes de ser reemplazadas
Tengo GridView con vistas de imagen que se cargan miniaturas de imagen de formulario de la galería. Estoy cargando estas miniaturas de una clase donde llamo a un método con la imagen id y imageview, el método establecerá el mapa de bits a imageview.Till pasado aquí funciona perfecto, pero hizo que el hilo para hacer una pausa cuando lanzamos la vista de cuadrícula.
Mi problema aquí es que se detiene cuando se desplaza, pero las imágenes se repiten en el gridview cuando se desplaza de arriba a abajo. No soy capaz de averiguar el problema exacto. ayúdame. ¡Gracias!
- Iónicos 2 problemas de rendimiento de desplazamiento
- Java - ¿Tendrá beneficios el código inlining?
- En una aplicación para Android, ¿cuándo se cargan los recursos en la memoria?
- ¿Cómo obtener mejoras de rendimiento mediante el procesamiento para Android?
- Cómo mejorar el rendimiento de ViewFlipper / ViewAnimator
Aquí cómo estoy fijando la pausa:
imagegrid.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView absListView, int scrollState) { // Pause fetcher to ensure smoother scrolling when flinging if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) { bitmapFromId.setPauseWork(true); } else { bitmapFromId.setPauseWork(false); } } @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
Aquí está mi opinión de conseguir en adaptador del grdiview:
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.galleryitem, null); holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage); holder.checkbox = (CheckBox) convertView.findViewById(R.id.itemCheckBox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } ImageItem item = images.get(position); holder.checkbox.setId(position); holder.imageview.setId(position); holder.checkbox.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub CheckBox cb = (CheckBox) v; int id = cb.getId(); if (images.get(id).selection) { cb.setChecked(false); images.get(id).selection = false; } else { cb.setChecked(true); images.get(id).selection = true; } } }); holder.imageview.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); ImageItem item = images.get(id); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); final String[] columns = { MediaStore.Images.Media.DATA }; Cursor imagecursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, MediaStore.Images.Media._ID + " = " + item.id, null, MediaStore.Images.Media._ID); if (imagecursor != null && imagecursor.getCount() > 0) { imagecursor.moveToPosition(0); String path = imagecursor.getString(imagecursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA)); File file = new File(path); imagecursor.close(); intent.setDataAndType(Uri.fromFile(file), "image/*"); startActivityForResult(intent, VIEW_IMAGE); } } }); holder.imageview.setLayoutParams(mImageViewLayoutParams); // Check the height matches our calculated column width if (holder.imageview.getLayoutParams().height != mItemHeight) { holder.imageview.setLayoutParams(mImageViewLayoutParams); } bitmapFromId.DisplayImage(item.id, holder.imageview); // holder.imageview.setImageBitmap(item.img); holder.checkbox.setChecked(item.selection); return convertView; }
Mi clase de cargador de mapa de bits:
public class BitmapFromId { MemoryCache memoryCache = new MemoryCache(); FileCache fileCache; private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>()); ExecutorService executorService; Context context; Handler handler = new Handler();// handler to display images in UI thread Resources mResources; private static final int FADE_IN_TIME = 400; private final Object mPauseLock = new Object(); private boolean mPaused = false; public BitmapFromId(Context context) { fileCache = new FileCache(context); executorService = Executors.newFixedThreadPool(5); this.context = context; mResources = context.getResources(); } public void DisplayImage(long id, ImageView imageView) { Bitmap bitmap = null; String _id = String.valueOf(id); imageViews.put(imageView, _id); bitmap = memoryCache.get(_id); if (bitmap != null) imageView.setImageBitmap(bitmap); else { queuePhoto(_id, imageView); imageView.setBackgroundResource(R.drawable.empty_photo); } } private void queuePhoto(String id, ImageView imageView) { PhotoToLoad p = new PhotoToLoad(id, imageView); executorService.submit(new PhotosLoader(p)); } // decodes image private Bitmap getImageFromId(String id) { Bitmap bitmap; long _id = Long.parseLong(id); final String[] columns = { MediaStore.Images.Media.DATA }; final String orderBy = MediaStore.Images.Media._ID; Cursor imagecursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, MediaStore.Images.Media._ID + " = " + _id + "", null, orderBy); int count = imagecursor.getCount(); for (int i = 0; i < count; i++) { imagecursor.moveToPosition(i); bitmap = MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(), _id, MediaStore.Images.Thumbnails.MICRO_KIND, null); return bitmap; } imagecursor.close(); return null; } // Task for the queue private class PhotoToLoad { public String id; public ImageView imageView; public PhotoToLoad(String _i, ImageView i) { id = _i; imageView = i; } } class PhotosLoader implements Runnable { PhotoToLoad photoToLoad; PhotosLoader(PhotoToLoad photoToLoad) { this.photoToLoad = photoToLoad; } @Override public void run() { try { if (imageViewReused(photoToLoad)) return; Bitmap bmp = getImageFromId(photoToLoad.id); memoryCache.put(photoToLoad.id, bmp); if (imageViewReused(photoToLoad)) return; BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad); handler.post(bd); synchronized (mPauseLock) { while (mPaused) { try { mPauseLock.wait(); } catch (InterruptedException e) { } } } } catch (Throwable th) { th.printStackTrace(); } } } boolean imageViewReused(PhotoToLoad photoToLoad) { String tag = imageViews.get(photoToLoad.imageView); if (tag == null || !tag.equals(photoToLoad.id)) return true; return false; } // Used to display bitmap in the UI thread class BitmapDisplayer implements Runnable { Bitmap bitmap; PhotoToLoad photoToLoad; public BitmapDisplayer(Bitmap b, PhotoToLoad p) { bitmap = b; photoToLoad = p; } public void run() { if (imageViewReused(photoToLoad)) return; if (bitmap != null) { // Load the image fetched: final TransitionDrawable td = new TransitionDrawable(new Drawable[] { new ColorDrawable(android.R.color.transparent), new BitmapDrawable(mResources, bitmap) }); photoToLoad.imageView.setImageDrawable(td); td.startTransition(FADE_IN_TIME); } else photoToLoad.imageView.setImageDrawable(null); } } public void clearCache() { memoryCache.clear(); fileCache.clear(); } public void setPauseWork(boolean pauseWork) { if (pauseWork) { synchronized (mPauseLock) { mPaused = true; } } else { synchronized (mPauseLock) { mPaused = false; mPauseLock.notifyAll(); } } } }
- Ionic: transiciones lentas en la aplicación android instalada
- Recuperar mediante programación los datos de uso de la red de etiquetas en Android
- Rendimiento JPG vs WebP en Android
- Es mejor inflar o instanciar los controles en Android?
- Android ORMLite crear objeto lento
- Diferencias de rendimiento entre SQLite en Android e iOS
- El desplazamiento de grandes listas de adaptadores basados en Cursor es más rápido que las listas mucho más pequeñas de adaptadores en memoria
- ¿Por qué el desarrollo de android con varios proyectos es lento en mi configuración?
Puede gestionar todo el mecanismo de control de carga / almacenamiento en caché con el marco Aquery.
Es muy sencillo. Por ejemplo, la carga / almacenamiento de imágenes de esta manera;
aq.id(R.id.YourImageViewID).image("http://www.vikispot.com/z/images/vikispot/android-w.png", memCache, fileCache);
Ver documentos de Aquery
- Phonegap – Evita la rotación mientras se sigue habilitando la orientación automática?
- Escanear e imprimir utilizando el dispositivo Android