`

ImageLoader异步加载的原理1--卡顿问题解决

 
阅读更多

            一个多月前在做影音播放器时遇到一个问题,就是在视频列表中显示每个视频第一帧,第一帧是显示出来了,可是滑动的时候出问题了,严重卡顿啊!!!一开始想的是要对图片进行压缩,压缩之后还是卡,然后想到了要开子线程(因为在Android中主线程不能执行耗时操作),把获取视频第一帧的操作放进去,这时候旧问题没有解决,新的问题又出现,图片与视频错位了,查了很多资料最后还是没有很好的解决。            直到今天这个问题终于完美解决了。也就写了ImageLoader类,大概50行代码。我们把获取视频第一帧的操作放入子线程中,根据传入的image(你要显示的在那个位置的图片,也就是Adapter类中 getView方法里通过findViewById获取的),url(视频的路径)

   

package zkx.com.mobileplayer.util;

/**
 * Created by zhang on 2016/10/14.
 */

import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.media.ThumbnailUtils;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;


/**
 * Created by zhang on 2016/11/27.
 */
public class ImageLoader {

    private ImageView mImageView;
    private String mUrl;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (mImageView.getTag().equals(mUrl)) {
                mImageView.setImageBitmap((Bitmap) msg.obj);
            }

        }
    };


    /**
     * @param imageView
     * @param url
     */
    public void showImageByThread(ImageView imageView, final String url) {
        mImageView = imageView;
        mUrl = url;
        new Thread() {
            @Override
            public void run() {
                super.run();
                MediaMetadataRetriever media = new MediaMetadataRetriever();
                media.setDataSource(url);
                Bitmap bitmap = media.getFrameAtTime(3000);
                bitmap = ThumbnailUtils.extractThumbnail(bitmap, 100, 100);
                Message message = Message.obtain();
                message.obj = bitmap;
                mHandler.sendMessage(message);
            }
        }.start();

    }

}

 

 

    然后在你的Adapter类的getView方法里,添上这几句,注意:这里我们iv_icon_video设置了一个唯一的标志tag(通过holder.iv_icon_video.setTag(url) 这段代码,url就是这个唯一的标志tag),相当于给iv_icon_video设置了一个唯一的身份信息,目的就是为避免由于ListView的缓存机制导致图片显示错位,然后调用ImageLoader的showImageByThread方法,传进去holder.iv_icon_video和 url(视频的路径)。然后就是通过showImageByThread方法获取视频第一帧了,我们将获取的bitmap通过Hander发送到了主线程,这样又解决了子线成不能更新UI的问题,然后在handlerMessage方法中处理bitmap,那么我们在Adapter中设置的标志tag就要发挥作用了,我们判断tag是否相同,相同则设置,不同则不处理,那么便解决了错位的问题

 

 

        //设置默认显示的图片
        holder.iv_icon_video.setImageResource(R.drawable.video_default_icon);
        String url = videoItem.getPath();
        holder.iv_icon_video.setTag(url);
        new ImageLoader().showImageByThread(holder.iv_icon_video, url);

 

 还有一点要说的就是在showImageByThread的这两行代码,他们的作用和BaseAdapter里的ViewHolder模式缓存view一样,他们也缓存imageView和url

 

       mImageView = imageView;
       mUrl = url;

 

分享到:
评论

相关推荐

    图片异步加载,照片墙,异步加载listview图片2

    1. 图片异步加载的重要性: 在移动设备上,如果图片资源直接在主线程中加载,可能会导致应用卡顿或ANR(Application Not Responding)错误。因此,异步加载图片是必要的,它可以在后台线程中处理图片下载和解码工作...

    dotnet-UnityImageLoader用于Unity中的图片异步显示加载库

    1. **异步加载**:通过异步操作,Unity-ImageLoader可以在不阻塞主线程的情况下加载图片资源,这样就不会影响游戏的流畅性。它利用Unity的协程(Coroutine)机制,确保图片在后台加载,只有当图片完全准备好后才会...

    Android图片异步加载-ListView、GridView、ViewPager

    总的来说,Android-Universal-Image-Loader为Android开发者提供了一种高效、灵活的图片异步加载解决方案,无论是ListView、GridView还是ViewPager,都可以通过其强大的功能提升用户体验。在实际开发中,掌握这个库的...

    图片异步加载开源组件Android-Universal-Image-Loader使用

    1. **异步加载原理**: 异步加载是指在主线程之外的子线程中进行图片的下载和解码,避免阻塞UI更新,提高应用性能。AUIL通过创建工作线程来处理图片的加载,当图片加载完成后再将结果显示到UI上,保证了用户界面的...

    异步加载的3d图片效果

    其次,异步加载(Asynchronous Loading)是解决性能问题的关键策略。在Android平台上,AFinal是一个轻量级的Android开发框架,它提供了简单易用的数据库操作和网络请求功能,尤其是其异步加载图片的能力。当用户滚动...

    异步加载imageloader

    异步加载在移动应用开发中是一项至关重要的技术,特别是在处理图像资源时,因为它们往往体积大,如果直接在主线程中加载可能导致应用卡顿甚至崩溃。" Imageloader" 是一个专门为解决这个问题而设计的库,它使得图片...

    ListView异步加载图片

    为了解决这个问题,我们需要采用异步加载图片的策略。这就是“ListView异步加载图片”这一知识点的核心。 异步加载图片的目的是将耗时的操作(如网络请求、图片解码)从主线程分离到后台线程执行,从而保持用户界面...

    GridView加载大量图片卡的问题

    在Android开发中,GridView是一种常见...综上所述,解决GridView加载大量图片卡顿的问题需要结合异步加载技术、高效的缓存策略以及合理的图片处理,通过这些方法,我们能够显著提升用户体验,打造流畅的图片加载效果。

    多线程异步下载图片Image-Loader

    为了优化用户体验,开发者通常会选择使用多线程和异步加载技术来处理图片下载。Android-Universal-Image-Loader(简称UIL)是一款强大的开源库,专门用于实现这一目标。本文将深入探讨UIL的工作原理、关键特性以及...

    UniversialImageLoader异步加载图片源代码

    1. **异步加载原理** - Android系统中,主线程(UI线程)负责处理用户交互和界面更新,因此不应在此线程中执行耗时操作,如网络请求或图片解码。异步加载图片就是将这些操作放在后台线程,完成后在主线程更新UI,...

    android异步加载网络图片实例

    使用 `ImageLoader` 和 `NetworkImageView` 可以轻松实现异步加载网络图片。 3. **Picasso**: Square 公司的 Picasso 库简化了图片的加载、缓存和展示。只需一行代码,就可以完成网络图片的异步加载,并且提供了...

    ImageLoader框架加载图片于ListView上

    其核心功能包括异步加载图片、图片缓存管理、错误处理等。在ListView中使用`ImageLoader`,能够避免因频繁加载图片导致的界面卡顿问题。 首先,我们需要集成`ImageLoader`框架。常见的有Volley库中的`ImageLoader`...

    Android-异步图片加载器

    1. **异步加载原理**: - 异步加载是一种将耗时操作放在后台线程进行的技术,避免阻塞主线程,提高用户体验。在Android中,通常使用Handler、Thread、AsyncTask或者更高级的库如`Loader`、`Volley`、`Retrofit`等来...

    官方 listview 异步加载图片

    为了解决这些问题,官方推荐采用异步加载图片的方式来优化用户体验。"官方 listview 异步加载图片"这个主题就是关于如何在ListView中高效、平滑地加载图片的技术实践。 异步加载的基本原理是在主线程之外(通常在...

    图片异步加载

    1. **图片异步加载**:在Android应用中,图片数据通常存储在网络或本地资源中,直接在主线程加载大图可能会导致应用卡顿,影响用户体验。因此,我们需要在后台线程进行图片加载,加载完成后再将结果显示到UI上,这...

    Android加载网络图片缓存处理库的使用-Universal-ImageLoader

    此外,UIL还支持异步加载图片、监听加载进度和取消加载等高级特性。例如,你可以添加一个ImageLoadingListener来监听加载状态: ```java ImageLoader.getInstance().displayImage(imageUrl, imageView, options, ...

    Android图片异步加载(双缓存)实例

    1. **异步加载图片** 在Android中,图片加载必须在后台线程执行,以避免阻塞UI主线程导致应用卡顿或ANR(Application Not Responding)错误。异步加载图片可以使用AsyncTask、Handler/Looper、IntentService或者第...

    listview 异步加载图片,滑动删除

    为了解决这些问题,通常会采用异步加载图片的技术,如ImageLoader。在本项目"listview 异步加载图片,滑动删除"中,开发者实现了一个功能完善的ListView,它不仅能够异步加载图片,还支持用户通过滑动来删除列表项。...

    ImageLoader

    ImageLoader正是针对这些需求而设计,它通过高效的缓存策略和多线程技术,解决了图片加载过程中的延迟和卡顿问题,使得图片在各种环境下都能流畅展现。 ### 主要特性 1. **异步加载**:ImageLoader支持在后台线程...

    异步加载图片示例DEMO,防止图片错位

    "异步加载图片示例DEMO,防止图片错位"这个项目正是为了解决这个问题而设计的。它利用了两种常见的图片加载库—— ImagLoader 和 Volley 的 ImageLoader,这两种工具都是为了优化用户体验,避免在滚动列表时因图片...

Global site tag (gtag.js) - Google Analytics