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  
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <GridView  
  7.         android:id="@+id/id_gridView"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:cacheColorHint="@android:color/transparent"  
  11.         android:columnWidth="90dip"  
  12.         android:gravity="center"  
  13.         android:horizontalSpacing="20dip"  
  14.         android:listSelector="@android:color/transparent"  
  15.         android:numColumns="auto_fit"  
  16.         android:stretchMode="columnWidth"  
  17.         android:verticalSpacing="20dip" >  
  18.     </GridView>  
  19.   
  20. </RelativeLayout>  

布局文件相当简单就一个GridView

2、MainActivity

[java]  view plain  copy  
  1. package com.example.zhy_handler_imageloader;  
  2.   
  3. import java.io.File;  
  4. import java.io.FilenameFilter;  
  5. import java.util.Arrays;  
  6. import java.util.HashSet;  
  7. import java.util.List;  
  8.   
  9. import android.app.Activity;  
  10. import android.app.ProgressDialog;  
  11. import android.content.ContentResolver;  
  12. import android.database.Cursor;  
  13. import android.net.Uri;  
  14. import android.os.Bundle;  
  15. import android.os.Environment;  
  16. import android.os.Handler;  
  17. import android.provider.MediaStore;  
  18. import android.widget.GridView;  
  19. import android.widget.ImageView;  
  20. import android.widget.ListAdapter;  
  21. import android.widget.Toast;  
  22.   
  23. public class MainActivity extends Activity  
  24.   
  25.     private ProgressDialog mProgressDialog;  
  26.     private ImageView mImageView;  
  27.       
  28.     /** 
  29.      * 存储文件夹中的图片数量 
  30.      */  
  31.     private int mPicsSize;  
  32.     /** 
  33.      * 图片数量最多的文件夹 
  34.      */  
  35.     private File mImgDir;  
  36.     /** 
  37.      * 所有的图片 
  38.      */  
  39.     private List<String> mImgs;  
  40.   
  41.     private GridView mGirdView;  
  42.     private ListAdapter mAdapter;  
  43.     /** 
  44.      * 临时的辅助类,用于防止同一个文件夹的多次扫描 
  45.      */  
  46.     private HashSet<String> mDirPaths = new HashSet<String>();  
  47.   
  48.     private Handler mHandler = new Handler()  
  49.       
  50.         public void handleMessage(android.os.Message msg)  
  51.           
  52.             mProgressDialog.dismiss();  
  53.             mImgs = Arrays.asList(mImgDir.list(new FilenameFilter()  
  54.               
  55.                 @Override  
  56.                 public boolean accept(File dir, String filename)  
  57.                   
  58.                     if (filename.endsWith(".jpg"))  
  59.                         return true;  
  60.                     return false;  
  61.                   
  62.             ));  
  63.             /** 
  64.              * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗; 
  65.              */  
  66.             mAdapter = new MyAdapter(getApplicationContext(), mImgs,  
  67.                     mImgDir.getAbsolutePath());  
  68.             mGirdView.setAdapter(mAdapter);  
  69.         ;  
  70.     ;  
  71.   以上是关于Android Handler 异步消息处理机制的妙用 创建强大的图片加载类的主要内容,如果未能解决你的问题,请参考以下文章

    Android异步消息处理机制

    Android的handler机制的原理?

    Android开发人员必看的 Handler 消息处理机制(源码实战)

    Android开发人员必看的 Handler 消息处理机制(源码实战)

    Android异步消息处理机制掌握,从源码了解常使用的Handler

    Android异步消息机制