一步一步写一个图片选择器 (ing)


图片选择功能在平时开发中十分常用,以前才混开发的时候总是用系统自动的调用图片的方式。不得不说那样很low,是时候和过去说拜拜了。

看了hongyang大牛关于图片选择器的博客和视频N遍,终于学会了如何写一个图片加载器。这里就一步步再次还原,留作纪念吧。如果以后有机会,我会完善这个,并添加一些新的生命力。

话不多说 

一、新建图片加载的工具类 (你也可以使用图片加载的框架跳过这部分)

1.初始化成员变量,并且使用单例

package com.warden.common;

import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v4.util.LruCache;

import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by warden on 16/3/28.
 */
public class PictureLoder
{
    /**
     * 实例
     */
    private static PictureLoder mInstance;
    /**
     * 图片缓存
     */
    private LruCache<String, Bitmap> mLruCache;
    /**
     * 线程数量
     */
    private int mThreadCount;
    /**
     * last in fist out(后进先出)
     * <p/>
     * last in last out(后进后出)
     */
    public enum PictureType
    {
        LIFO, LILO
    }
    /**
     * 调度方式
     */
    private PictureType mType;
    /**
     * 线程池
     */
    private ExecutorService mTheadPool;
    /**
     * 任务队列,加载图片的任务体
     */
    private LinkedList<Runnable> mTaskQueue;
    /**
     * 一个默默工作的 轮训工人
     */
    private Thread mWorkerThread;
    /**
     * UI线程 的 Hanlder
     */
    private Handler mUiHandler;
    /**
     * 用于轮训的异步机制
     */
    private Handler mWorkerHandler;

    /**
     * 私有化 构造器
     */
    private PictureLoder(int threadCount, PictureType type)
    {
        mThreadCount = threadCount;
        mType = type;
        //将运行内存的8分之1作为缓存的大小
        int cacheSize = (int) (Runtime.getRuntime().maxMemory() / 8);
        //初始化缓存
        mLruCache = new LruCache<String, Bitmap>(cacheSize)
        {
            @Override
            protected int sizeOf(String key, Bitmap value)
            {
                //测量每一个Bitmap的大小
                //高度 * 每一行的字节数
                return value.getHeight() * value.getRowBytes();
            }
        };
        //后台轮训线程
        mWorkerThread = new Thread()
        {
            @Override
            public void run()
            {
                //准备
                Looper.prepare();
                mWorkerHandler = new Handler()
                {
                    @Override
                    public void handleMessage(Message msg)
                    {
                        //TODO 异步的消息处理
                        //TODO 线程同步
                    }
                };

                //死循环吧...
                Looper.loop();
            }
        };
        //轮训吧- -
        mWorkerThread.start();

        //队列初始化
        mTaskQueue=new LinkedList<Runnable>();

        //初始化线程池,虽然这货还不是很熟。先用着吧.
        mTheadPool= Executors.newFixedThreadPool(mThreadCount);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值