Android异步加载全解析之开篇瞎扯淡
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 mData;
public MyAdapterNotUseCaches(Context context, List data) {
this.mData = https://www.it610.com/article/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[] {
"https://img-my.csdn.net/uploads/201407/26/1406383299_1976.jpg",
"https://img-my.csdn.net/uploads/201407/26/1406383291_6518.jpg",
"https://img-my.csdn.net/uploads/201407/26/1406383291_8239.jpg",
"https://img-my.csdn.net/uploads/201407/26/1406383290_9329.jpg",
"https://img-my.csdn.net/uploads/201407/26/1406383290_1042.jpg",
"https://img-my.csdn.net/uploads/201407/26/1406383275_3977.jpg",
"https://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 mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.lv);
mData = https://www.it610.com/article/Arrays.asList(Images.IMAGE_URLS);
mListView.setAdapter(……);
}
}
测试图像搞定~我们后面继续~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我的Github
我的视频 慕课网
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)