您的位置:首页 > 其它

多线程和异步下载图片

2017-04-26 11:34 246 查看
一开始从慕课网学习到的异步加载显示图片,今天终于有时间按照记忆写了份异步加载图片代码;有很多小细节需要注意的。
步骤:
1、先解析完JSon数据,并存放在List中间
2、异步下载图片,放在Item.xml中
3、listView.setAdapter(teacherAapter);


1、从类开始介绍:

Teacher:图片bean

TeacherAdapter:适配器

ImageLoad:根据URL获取图片,显示到Item.xml中

MainActivity:从Json中获取数据,调用适配器,并显示;

2、解析Json

通过Thread来适配

public  void getTeacher()
{
new Thread()
{
@Override
public void run() {

try
{
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.imooc.com/api/teacher?type=4&num=30")
.build();
Response response = client.newCall(request).execute();
String data = response.body().string();
parseJson(data);
//初始化适配器和列表
final TeacherAapter teacherAapter = new TeacherAapter(MainActivity.this,teacherList);
runOnUiThread(new Runnable() {
@Override
public void run() {
//在子线程中设置界面
listView.setAdapter(teacherAapter);
}
});
}catch (Exception e)
{
e.printStackTrace();
}
}
}.start();
}
//解析Json
public  void parseJson(String data)
{
try
{
JSONObject jsonObject1 = new JSONObject(data);
JSONArray jsonArray = jsonObject1.getJSONArray("data");
System.out.println("length:"+jsonArray.length());
for(int i=0;i<jsonArray.length();i++)
{
JSONObject jsonObject = jsonArray.getJSONObject(i);
Teacher teacher = new Teacher();
teacher.setName(jsonObject.getString("name"));
Log.d("name:",jsonObject.getString("name"));
teacher.setPicSmall(jsonObject.getString("picSmall"));
teacher.setDescription(jsonObject.getString("description"));
teacherList.add(teacher);
System.out.println("tea_list:"+teacherList.size());
}
}catch (Exception e)
{
e.printStackTrace();
}
}


AsyncTask 异步加载来适配

class MyAsyncTask extends AsyncTask<String,Void,List<Teacher>>
{
@Override
protected List<Teacher> doInBackground(String... params) {

teacherList = getTeacher(params[0]);
return teacherList;
}

@Override
protected void onPostExecute(List<Teacher> teacherList) {
super.onPostExecute(teacherList);
TeacherAapter teacherAapter = new TeacherAapter(MainActivity.this,teacherList);
listView.setAdapter(teacherAapter);
}
}


//调用异步任务
new MyAsyncTask().execute(url);


3、加载图片

通过Thread加载

Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//            通过判断加载的路径是否正确来加载图片,
if (imageView.getTag().equals(url))
imageView.setImageBitmap((Bitmap) msg.obj);
}
};
public void showImageByThread(ImageView imageView, final String url) {

this.url = url;
this.imageView = imageView;
new Thread(new Runnable() {
@Override
public void run() {
try {
Bitmap bitmap = getFromCache(url);
if (bitmap == null) {
URL url1 = new URL(url);
HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
InputStream is = connection.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();

//加入缓存
addToCache(url, bitmap);
}
//                    OkHttpClient client = new OkHttpClient();
//                    Request request = new Request.Builder()
//                            .url(url)
//                            .build();
//                    Response response = client.newCall(request).execute();
//                    byte[] b =response.body().string().getBytes();
//                    System.out.println("b.length"+b.length);
//                    bitmap = BitmapFactory.decodeByteArray(b,0,b.length);
Message message = handler.obtainMessage();
message.obj = bitmap;
handler.sendMessage(message);

} catch (Exception e) {
e.printStackTrace();
}

}
}).start();
}


通过异步加载图片

//通过异步的方法加载
public void showImageByAsy(ImageView imageView, final String url) {
this.url = url;
this.imageView = imageView;
new MyAsyLoad().execute(url);
}

class MyAsyLoad extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap
9f48
doInBackground(String... params) {
Bitmap bitmap = getFromCache(params[0]);
if (bitmap != null)
return bitmap;
try {
URL url1 = new URL(params[0]);
HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
InputStream is = connection.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
addToCache(params[0], bitmap);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}

@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null && imageView != null)
imageView.setImageBitmap(bitmap);
}
}


4、Lrucache缓存

private LruCache<String, Bitmap> mCache;

public ImageLoad() {
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
// 设置图片缓存大小为程序最大可用内存的1/8
mCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  异步 图片