项目作者: flemingme

项目描述 :
一个可以用来加载图片的库,并且提供了操作bitmap的工具类
高级语言: Java
项目地址: git://github.com/flemingme/ImageLoader.git
创建时间: 2016-06-09T14:48:46Z
项目社区:https://github.com/flemingme/ImageLoader

开源协议:

下载


ImageLoader

前言:AsyncTask的本身其实是对Handler机制的封装,目的是让异步操作的实现变得简单,更多的关注业务实现。

使用AsyncTask异步任务类的基本步骤:

1.创建一个继承自AsyncTask的类。

2.确定AsyncTask 泛型的三个参数类型。

3.重写以下方法:

  1. protected void onPreExecute() //可选
  2. protected abstract Result doInBackground(Params... params); //必须重写
  3. protected void onPostExecute(Result result) //可选,但一般都会重写
  4. protected void onProgressUpdate(Progress... values) //可选,如果不需要进度可以写Void(大写的V)

注意:

onPreExecute 方法会在execute方法调用前调用,运行在UI线程,可以做进度框的展示等

doInBackground方法的参数是可选参数,类型由创建类时决定,并且该方法是执行在子线程中的,可以做一些耗时操作

onPostExecute 方法的参数也是创建类时决定,可以是String、Bitmap类型等,运行在UI线程中,根据返回的result,这里的result的类型就是doInBackground 的返回值类型,因此可以更新UI

onProgressUpdate 方法的参数是可选参数,可以展示任务处理的进度,不过需要通过在doInBackground 中根据下载内容占总下载内容的比例主动调用publishProgress 方法,才会回调onProgressUpdate 方法。

4.实例化该异步任务类,并调用AsyncTask<Params, Progress, Result> execute(Params... params) 方法启动任务。

在本项目中,使用了两种常用的返回类型的异步任务类,分别完成下载api返回的String类型的json数据并解析成集合数据和Bitmap类型的图片的任务,主要代码如下:

这里我取的是知乎日报的获取最近消息的api,感谢大神的共享,先上api文档链接:https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90

第一种类型:

  1. private static final String URL = "https://news-at.zhihu.com/api/4/news/latest";
  2. private class StoryAsyncTask extends AsyncTask<String, Viod, List<Story.StoriesBean>> {
  3. @Override
  4. protected List<Story.StoriesBean> doInBackground(String... params) {
  5. return getJsonString(params[0]);//参数个数为1,下标则为0
  6. }
  7. @Override
  8. protected void onPostExecute(List<Story.StoriesBean> stories) {
  9. mAdapter.addListData(stories);//直接返回adapter所需要的集合类型,为什么这样做?俩字儿“方便”
  10. mRefreshLayout.setRefreshing(false);
  11. }
  12. }
  13. //执行
  14. new StoryAsyncTask().execute(URL);

第二种类型:

  1. public class BitmapAsyncTask extends AsyncTask<String, Void, Bitmap> {
  2. private BitmapCallBack mCallBack;
  3. public BitmapAsyncTask(BitmapCallBack callBack) {
  4. mCallBack = callBack;
  5. }
  6. @Override
  7. protected Bitmap doInBackground(String... params) {
  8. //从网络上获取到的图片存到缓存中
  9. return BitmapUtils.getBitmapFromUrl(params[0]);
  10. }
  11. @Override
  12. protected void onPostExecute(Bitmap bitmap) {
  13. if (mCallBack != null) {
  14. mCallBack.onComplete(bitmap);
  15. }
  16. }
  17. public interface BitmapCallBack {
  18. void onComplete(Bitmap bitmap);
  19. }
  20. }

如何在项目中使用ImageLoader库呢?

导入方法:

  1. allprojects {
  2. repositories {
  3. ...
  4. maven { url "https://jitpack.io" }
  5. }
  6. }
  7. dependencies {
  8. compile 'com.github.flemingme:ImageLoader:1.0.0'
  9. }

用法注意:

  1. public void showImage(final ImageView imageView, final String url,
  2. final boolean round, final float roundPx) {
  3. Bitmap bitmap = getBitmapFromCache(url);//先从缓存中获取
  4. //如果缓存中存在就直接设置给imageView,否则就去下载
  5. if (bitmap != null) {
  6. //缓存大小要设置的合理一些,否则有的图片无法进入缓存,则需要通过网络获取
  7. imageView.setImageBitmap(bitmap);
  8. Log.d(TAG, "showImage: from cache");
  9. } else {
  10. new BitmapAsyncTask(new BitmapAsyncTask.BitmapCallBack() {
  11. @Override
  12. public void onComplete(Bitmap bitmap) {
  13. if (imageView.getTag().equals(url)) {
  14. if (round) {
  15. bitmap = BitmapUtils.getRoundedCornerBitmap(bitmap, roundPx);
  16. }
  17. imageView.setImageBitmap(bitmap);
  18. addBitmapToCache(url, bitmap);
  19. }
  20. }
  21. }).execute(url);
  22. Log.d(TAG, "showImage: from net");
  23. }
  24. }

可以直接通过ImageLoader.with()来进行调用。

相关:关于cache的部分,请点击如何利用LruCache进行数据缓存进行查看。

另外附上AsyncTask异步任务之源码解析:http://blog.csdn.net/maplejaw_/article/details/51441312