Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
Posted 阿七不会写代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Handler 异步消息处理机制的妙用 创建强大的图片加载类相关的知识,希望对你有一定的参考价值。
出处:http://blog.csdn.net/lmj623565791/article/details/38476887
1、概述
一般大量图片的加载,比如GridView实现手机的相册功能,一般会用到LruCache,线程池,任务队列等;那么异步消息处理可以用哪呢?
1、用于UI线程当Bitmap加载完成后更新ImageView
2、在图片加载类初始化时,我们会在一个子线程中维护一个Loop实例,当然子线程中也就有了MessageQueue,Looper会一直在那loop停着等待消息的到达,当有消息到达时,从任务队列按照队列调度的方式(FIFO,LIFO等),取出一个任务放入线程池中进行处理。
简易的一个流程:当需要加载一张图片,首先把加载图片加入任务队列,然后使用loop线程(子线程)中的hander发送一个消息,提示有任务到达,loop()(子线程)中会接着取出一个任务,去加载图片,当图片加载完成,会使用UI线程的handler发送一个消息去更新UI界面。
说了这么多,大家估计也觉得云里来雾里去的,下面看实际的例子。
2、图库功能的实现
该程序首先扫描手机中所有包含图片的文件夹,最终选择图片最多的文件夹,使用GridView显示其中的图片
1、布局文件
[html] view plain copy
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <GridView
- android:id="@+id/id_gridView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:cacheColorHint="@android:color/transparent"
- android:columnWidth="90dip"
- android:gravity="center"
- android:horizontalSpacing="20dip"
- android:listSelector="@android:color/transparent"
- android:numColumns="auto_fit"
- android:stretchMode="columnWidth"
- android:verticalSpacing="20dip" >
- </GridView>
- </RelativeLayout>
布局文件相当简单就一个GridView
2、MainActivity
[java] view plain copy
- package com.example.zhy_handler_imageloader;
- import java.io.File;
- import java.io.FilenameFilter;
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.List;
- import android.app.Activity;
- import android.app.ProgressDialog;
- import android.content.ContentResolver;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Environment;
- import android.os.Handler;
- import android.provider.MediaStore;
- import android.widget.GridView;
- import android.widget.ImageView;
- import android.widget.ListAdapter;
- import android.widget.Toast;
- public class MainActivity extends Activity
- private ProgressDialog mProgressDialog;
- private ImageView mImageView;
- /**
- * 存储文件夹中的图片数量
- */
- private int mPicsSize;
- /**
- * 图片数量最多的文件夹
- */
- private File mImgDir;
- /**
- * 所有的图片
- */
- private List<String> mImgs;
- private GridView mGirdView;
- private ListAdapter mAdapter;
- /**
- * 临时的辅助类,用于防止同一个文件夹的多次扫描
- */
- private HashSet<String> mDirPaths = new HashSet<String>();
- private Handler mHandler = new Handler()
- public void handleMessage(android.os.Message msg)
- mProgressDialog.dismiss();
- mImgs = Arrays.asList(mImgDir.list(new FilenameFilter()
- @Override
- public boolean accept(File dir, String filename)
- if (filename.endsWith(".jpg"))
- return true;
- return false;
- ));
- /**
- * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
- */
- mAdapter = new MyAdapter(getApplicationContext(), mImgs,
- mImgDir.getAbsolutePath());
- mGirdView.setAdapter(mAdapter);
- ;
- ;
- 以上是关于Android Handler 异步消息处理机制的妙用 创建强大的图片加载类的主要内容,如果未能解决你的问题,请参考以下文章
Android开发人员必看的 Handler 消息处理机制(源码实战)
Android开发人员必看的 Handler 消息处理机制(源码实战)