android - 滚动列表或在新行中下载新图像时 imageView 中的图像闪烁

标签 android scroll imageview

我经历过许多与图像闪烁问题类似的问题。 我无法纠正它。作为初学者,我无法理解该怎么做。

这是我的代码..我在其中设置图像的缩略图。

private void setThumbnail(final ContentResolver contentResolver, final ViewHolder aHolder,
        final Uri uri) {
    new AsyncTask<String, Void, Bitmap>() {

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

            Bitmap result = mBitmapCache.get(uri.toString());

            if (result == null)
                return getThumbnail(contentResolver, uri);
            else
                return result;
        }

        @Override
        protected void onPostExecute(Bitmap result) {



            if (uri != null && result != null) {
                //                    Log.d(TAG, "setThumbnail result not  null");
                //                    Log.d(TAG, "uri= "+uri);
                //                    Log.d(TAG, "aHolder.mMediaUri= "+aHolder.mMediaUri);
                mBitmapCache.put(uri.toString(), result);

                // confirm the holder is still paired to this uri
                if (!uri.equals(aHolder.mMediaUri)) {
                    return;
                }

                // set the thumbnail
                 ImageLoader imageLoader=ImageLoader.getInstance();
                imageLoader.init(ImageLoaderConfiguration.createDefault(getContext()));
                DisplayImageOptions options = new DisplayImageOptions.Builder()
           //     .showImageForEmptyUri(R.drawable.ic_empty)
           //   .showImageOnFail(R.drawable.ic_error)
                .resetViewBeforeLoading(true).cacheOnDisk(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565).considerExifParams(true)
                .cacheInMemory(true)
                .displayer(new FadeInBitmapDisplayer(300)).build();

                imageLoader.displayImage(uri.toString(), aHolder.mMediaThumbnail, options);
               // aHolder.mMediaThumbnail.setImageBitmap(result);
            } else {
                //                    Log.d(TAG, "setThumbnail result  null");
            }
          }
       }.execute();
   }

最佳答案

在需要时添加 ListView View (参见 https://stackoverflow.com/a/14108676/2274724)。因此,您的项目将在您调用 notifyDataSetChange() 或滚动列表时创建。

因此,无论何时创建 View ,您的图像都会从缓存中再次加载,这会导致闪烁。有一个解决方案:

首先在后台线程中加载图像(来自网络或 Assets ),然后像您一样创建位图缓存,但如果图像存在于位图缓存中,则直接使用 AsyncTask 获取图像而不是获取图像(但这又不是一个好方法,因为它会停止闪烁,但当尺寸较大时列表滚动将不平滑)。

我会建议使用 UniversalImageLoader .他们以更好的方式实现了内存缓存。

private void setThumbnail(final ContentResolver contentResolver, final ViewHolder aHolder,
        final Uri uri) {
ImageLoader.getInstance().displayImage(
                            uri.toString(),
                            aHolder.mMediaThumbnail, getDisplayOption());
}

// Add or remove option according to your requirement
private DisplayImageOptions getDisplayOption() {
        return new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.ic_launcher)
                .showImageOnLoading(R.drawable.ic_launcher)
                .showImageOnFail(R.drawable.ic_launcher).cacheInMemory(true)
                .cacheOnDisk(true).resetViewBeforeLoading(true)
                .displayer(new RoundedBitmapDisplayer(22))
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .bitmapConfig(Bitmap.Config.RGB_565).build();
    }

//Put it in your Application file and call it just once.
private void initImageLoader() {

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                getApplicationContext())
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .denyCacheImageMultipleSizesInMemory()
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .defaultDisplayImageOptions(getDisplayOption()).build();
        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config);
    }

关于android - 滚动列表或在新行中下载新图像时 imageView 中的图像闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337066/

相关文章:

android:load svg file from web and show it on image view

android - 拖放时如何找到两个ImageView之间的交集?

Android 蓝牙快速设备发现

android - ListView 放在 ScrollView 中,是个坏主意吗?那么如何替换 ScrollView 中动态填充的列表呢?

html - 如何在CSS中添加滚动条

java - 添加 ImageView 会导致 Android 应用小部件崩溃

android - HttpResponse execute for android 中的主机名不能为空

java - Android:将 SharedPreferences 与选项卡布局结合使用

android - Android 中的圆环按钮

vim - 如何在 Vim 中移动屏幕而不移动光标?