Android异步加载

概述

Android异步加载在Android中使用的非常广泛,除了是因为避免在主线程中做网络操作,更是为了避免在显示时由于时间太长而造成ANR,增加显示的流畅性,特别是像ListView、GridView这样的控件,如果getView的时间太长,就会造成非常严重的卡顿,非常影响性能。
本系列将展示在Android中如何进行异步加载操作,并使用ListView来作为演示的对象。

如何下载图像

下载自然是需要使用网络,使用网络就不能在主线程,在主线程就会爆炸。所以我们必须要在非主线程中去下载图像。OK,那么下载使用的方法呢,非常多,这里简单的列举几种

HttpURLConnection

private static Bitmap getBitmapFromUrl(String urlString) {    Bitmap bitmap;    InputStream is = null;    try {        URL url = new URL(urlString);        HttpURLConnection conn = (HttpURLConnection) url.openConnection();        is = new BufferedInputStream(conn.getInputStream());        bitmap = BitmapFactory.decodeStream(is);        conn.disconnect();        return bitmap;    } catch (Exception e) {        e.printStackTrace();    } finally {        try {            if (is != null)                is.close();        } catch (IOException e) {        }    }    return null;}

非常简单,甚至都没做超时等处理,这里偷个懒。

Drawable

Drawable d = Drawable.createFromStream(is, "url");

也非常简单,只是需要进行下转换。

ListView

这一篇作为开篇,我们还是来扯下淡,这个ListView,大家都用过,最常用的优化也就是使用ViewHolder模式进行复用,避免重复的inflate和findViewById而影响效率,相信大部分的开发者都已经熟知,这里我们还是贴下Adapter的代码:
package com.imooc.listviewacyncloader;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import java.util.List;public class MyAdapterNotUseCaches extends BaseAdapter {    private LayoutInflater mInflater;    private List<String> mData;    public MyAdapterNotUseCaches(Context context, List<String> data) {        this.mData = data;        mInflater = LayoutInflater.from(context);    }    @Override    public int getCount() {        return mData.size();    }    @Override    public Object getItem(int position) {        return mData.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        String url = mData.get(position);        ViewHolder viewHolder = null;        if (convertView == null) {            viewHolder = new ViewHolder();            convertView = mInflater.inflate(R.layout.listview_item, null);            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_lv_item);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();        }        viewHolder.imageView.setTag(url);        viewHolder.imageView.setImageResource(R.drawable.ic_launcher);        return convertView;    }    public class ViewHolder{        public ImageView imageView;    }}

确实非常简单哈,最基本的ViewHolder模式使用ListView,不过,这里有点需要注意的:
viewHolder.imageView.setTag(url);

这个其实是非常重要的,为什么重要我们后面会继续说。除了这个地方,其它的部分,如果你能独立写出来,相信你已经击败了10%的开发者了,后面我们再来讲如何击败剩下90%的开发者。

图像

图像我们可以从网络相册里面来获取,这里偶然找到郭神的一篇博客里面的图像地址,就无耻的拿来用了:
public class Images {    public final static String[] IMAGE_URLS = new String[] {            "http://img.my.csdn.net/uploads/201407/26/1406383299_1976.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383291_8239.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg",
……
那么我们在MainActivity中就可以导入这些图像了:
package com.imooc.listviewacyncloader;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import java.util.Arrays;import java.util.List;public class MainActivity extends Activity {    private ListView mListView;    private List<String> mData;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.lv);        mData = Arrays.asList(Images.IMAGE_URLS);        mListView.setAdapter(……);    }}

测试图像搞定~我们后面继续~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


我的Github
我的视频 慕课网






更多相关文章

  1. 使用GDB调试Android(安卓)NDK native(C/C++)程序
  2. Android系统框架总结(好文)
  3. 基于android的远程视频监控系统(已开放源码)
  4. Android(安卓)系列 5.9使用Inkscape创建Android(安卓)Launcher图
  5. Android的消息机制,用Android线程间通信的Message机制,Android中Ha
  6. 播放音乐时的状态条使用
  7. Android使用SQLiteDatabase直接存取数据与图像
  8. Android标题栏各种设置
  9. Dagger2在Android(安卓)studio中的配置与简单使用

随机推荐

  1. 实例详解sort()函数的原理和使用方法
  2. 基于MVC5中的Model层开发数据注解_实用技
  3. 代码详解AVL树的插入
  4. 厌倦写代码的人是如何做软件开发的
  5. 用户管理和权限和设置——mysql
  6. asp.net core封装layui组件的示例详解
  7. UWP中设置控件样式四种方法
  8. C#中关于DBNULL的解释
  9. ASP.NET Core中用户登录验证实现最低配置
  10. 有关ASP.NET中Config文件的读写讲解