// task.execute(imageUrl);//启动单线程 ,就是图片按顺序一张一张的下载, // task.executeOnExecutor(mExec, imageUrl);// 启动多线程,同时下载多张图片,效率比较高
package com.example.myandroid.json;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.example.myandroid.R;
import com.example.myandroid.http.AsyncLoaderImage;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class HttpImageGridViewBetterActivity extends Activity {
public final static String[] imageThumbUrls = new String[] {
"http://h.hiphotos.baidu.com/image/pic/item/0b55b319ebc4b7452c1b0e16cdfc1e178a821526.jpg",
"http://a.hiphotos.baidu.com/image/pic/item/9f510fb30f2442a751a29476d543ad4bd01302b0.jpg",
"http://e.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494eec48c66ca29f5e0fe98257eb2.jpg",
"http://f.hiphotos.baidu.com/image/pic/item/1e30e924b899a901f19c32e519950a7b0308f5bc.jpg",
"http://e.hiphotos.baidu.com/image/pic/item/63d0f703918fa0eca4042edf229759ee3c6ddb25.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/a1ec08fa513d2697f631428f51fbb2fb4216d806.jpg",
"http://b.hiphotos.baidu.com/image/pic/item/ac4bd11373f08202034236d14ffbfbedaa641b0f.jpg",
"http://e.hiphotos.baidu.com/image/pic/item/58ee3d6d55fbb2fbafb52bfa4b4a20a44723dcb8.jpg",
"http://a.hiphotos.baidu.com/image/pic/item/c8177f3e6709c93d08d97a679a3df8dcd1005472.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/bd3eb13533fa828b01fbafb2ff1f4134960a5a82.jpg",
"http://b.hiphotos.baidu.com/image/pic/item/8326cffc1e178a82689d65adf403738da977e81e.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8d141851dce1349540823768e.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/72f082025aafa40f7c884d31af64034f79f0198b.jpg",
"http://a.hiphotos.baidu.com/image/pic/item/d53f8794a4c27d1eaa8358171fd5ad6edcc438bf.jpg",
"http://d.hiphotos.baidu.com/image/pic/item/902397dda144ad344a35e454d4a20cf430ad855e.jpg",
"http://a.hiphotos.baidu.com/image/pic/item/728da9773912b31be0f04c498318367adab4e136.jpg",
"http://d.hiphotos.baidu.com/image/pic/item/5bafa40f4bfbfbed88e0cfa07cf0f736aec31fb7.jpg",
"http://c.hiphotos.baidu.com/image/pic/item/8d5494eef01f3a299fff02c79b25bc315c607c80.jpg",
"http://pic7.nipic.com/20100522/1263764_002013845527_2.jpg",
"http://a2.att.hudong.com/12/26/19300000362045133857269184471_950.jpg",
"http://pic3.nipic.com/20090617/1242397_083514091_2.jpg",
"http://pic28.nipic.com/20130422/12457151_164027506188_2.jpg",
"http://pic4.nipic.com/20091120/805653_183746006558_2.jpg",
"http://pic7.nipic.com/20100606/4899050_135353003843_2.jpg",
"http://pic4.nipic.com/20091218/3557379_083034065299_2.jpg",
"http://pic4.nipic.com/20090924/3308315_095324041734_2.jpg",
"http://pica.nipic.com/2008-01-18/2008118212025258_2.jpg",
};
private GridView mGridView;
private Executor mExec;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.httpgridview);
mExec = new ThreadPoolExecutor(15, 150, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
mGridView = (GridView) findViewById(R.id.httpimage_gridview);
MyGridViewAdapter adapter = new MyGridViewAdapter(this, imageThumbUrls);
mGridView.setAdapter(adapter);
}
public class MyGridViewAdapter extends BaseAdapter {
private String[] list;
private LayoutInflater mInflater;
public MyGridViewAdapter(Context context, String[] arrays) {
this.list = arrays;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.length;
}
@Override
public Object getItem(int position) {
return list[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ImageView contentImg;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.httpgridview_item,
null);
contentImg = (ImageView) convertView
.findViewById(R.id.httpgirdimage_image);
convertView.setTag(contentImg);
} else {
contentImg = (ImageView) convertView.getTag();
}
String itemUrl = (String) getItem(position);
/**
* 保存AsyncTask,
* 下次进入时,首行判断AsyncTask是否存在,如果存在,判断是否同一个AsyncTask,如果同一个AsyncTask
* ,结束掉原先然后启动新的AsyncTask,
*/
loadBitmap(itemUrl, contentImg, R.drawable.sev_page);
return convertView;
}
}
public Bitmap getBitmapByHttp(String httpUrl) {
InputStream ins = null;
try {
URL url = new URL(httpUrl);
// HttpURLConnection connect = (HttpURLConnection)
// url.openConnection();
// ins = connect.getInputStream();
ins = url.openStream();
Bitmap bitmap = BitmapFactory.decodeStream(ins);
return bitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ins != null) {
try {
ins.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public void loadBitmap(String imageUrl, ImageView imageView, int res) {
if (cancelPotentialWork(imageUrl, imageView)) {
BitmapWorkerTask task = new BitmapWorkerTask(imageView);
AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(),
BitmapFactory.decodeResource(getResources(), res), task);
imageView.setImageDrawable(asyncDrawable);
task.executeOnExecutor(mExec, imageUrl);// 启动多线程
// task.execute(imageUrl);//启动单线程
}
}
public static boolean cancelPotentialWork(String imageUrl,
ImageView imageView) {
final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
if (bitmapWorkerTask != null) {
final String bitmapData = bitmapWorkerTask.data;
if (!bitmapData.equals(imageUrl)) {
// Cancel previous task
bitmapWorkerTask.cancel(true);
} else {
// The same work is already in progress
return false;
}
}
// No task associated with the ImageView, or an existing task was
// cancelled
return true;
}
private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {
if (imageView != null) {
final Drawable drawable = imageView.getDrawable();
if (drawable instanceof AsyncDrawable) {
final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
return asyncDrawable.getBitmapWorkerTask();
}
}
return null;
}
/**
* 创建一个专用的Drawable的子类来储存返回工作任务的引用。在这种情况下,当任务完成时BitmapDrawable会被使用
*
*/
static class AsyncDrawable extends BitmapDrawable {
private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;
public AsyncDrawable(Resources res, Bitmap bitmap,
BitmapWorkerTask bitmapWorkerTask) {
super(res, bitmap);
bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(
bitmapWorkerTask);
}
public BitmapWorkerTask getBitmapWorkerTask() {
return (BitmapWorkerTask) bitmapWorkerTaskReference.get();
}
}
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private String data = "";
public BitmapWorkerTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage
// collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(String... params) {
data = params[0];
return getBitmapByHttp(data);
}
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = (ImageView) imageViewReference
.get();
final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
if (this == bitmapWorkerTask && imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
}
xml布局文件跟上一篇博客里的布局一样,这里就不重复了。