异步任务Asynctask实现图片墙

前面学习了通过异步任务Asynctask实现从网络中取图片。这里采用这种方式并结合GirdView适配器实现九宫格图片墙。

1、通过网络地址获取Bitmap对象Demo:

/*连接网络取数据*/
	public Bitmap getPicture(String URLpath){
		try {
			URL url = new URL(URLpath);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			InputStream in = conn.getInputStream();  //将对应地址的图片读入流
			Bitmap bitmap = BitmapFactory.decodeStream(in);   //将流转化为Bitmap对象。
			return bitmap;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

数据源采用图片网络地址字符串数组的形式传入,最关键是GirdView适配器中的getView()方法,这里面实现了Asynctask的异步任务。有两种方式,一种是一张图片加载完成后再去加载另一张图片,另一种是几张图片同时开始加载,完成后再去加载其他的图片。

适配器Demo如下:

1、一张一张的加载:在geiView()方法中实现异步加载图片并调用execte()方法开始异步操作。

<span style="white-space:pre">		</span>@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = inflater.inflate(R.layout.gridviewasynctask_item_layout, null);
			}
			final ImageView img = (ImageView) convertView.findViewById(R.id.item_img);
			String HttpPath = (String) getItem(position);
			/*启动异步任务下载图片,下载一张就设置一张。但是在滑动时会复用convertView,所以可能出项重复图片*/
			new AsyncTask<String, Void, Bitmap>() {
				@Override
				protected Bitmap doInBackground(String... params) {
					return getPicture(params[0]);
				}
				@Override
				protected void onPostExecute(Bitmap result) {
					super.onPostExecute(result);
					if(result != null){
						img.setImageBitmap(result);
					}
				}
			}.execute(HttpPath);
			return convertView;
		}

效果如下:

从效果中可以看到是一张一张加载完成之后才去加载下一张。

另一种是同时加载几张图片。没多大区别,只是在开启异步操作时调用的是executeOnExecutor(executors, HttpPath)方法。需要构造一个Executor类的对象作为参数。构造方式如下:

executors = new ThreadPoolExecutor(5, 150, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());

第一个参数为可以同时开启多少个异步操作,第二个参数异步操作的最大容量,第三个为延迟时间,第四个为时间单位。第五个不太清楚,应该是构成循环队列。

贴上多张图片同时加载的适配器代码:

/*一次加载多张的适配器*/
	public class MoreAsynctaskGridViewAdapter extends BaseAdapter{
		private String[] strData;
		private LayoutInflater inflater;
		public MoreAsynctaskGridViewAdapter(Context context){
			inflater = LayoutInflater.from(context);
		}
		
		public void setData(String[] data){
			this.strData = data;
			notifyDataSetChanged();
		}
		@Override
		public int getCount() {
			return urlPath.length;
		}

		@Override
		public Object getItem(int position) {
			return urlPath[position];
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = inflater.inflate(R.layout.gridviewasynctask_item_layout, null);
			}
			final ImageView img = (ImageView) convertView.findViewById(R.id.item_img);
			String HttpPath = (String) getItem(position);
			/*启动异步任务下载图片,下载一张就设置一张。但是在滑动时会复用convertView,所以可能出项重复图片*/
			new AsyncTask<String, Void, Bitmap>() {
				@Override
				protected Bitmap doInBackground(String... params) {
					return getPicture(params[0]);
				}
				
				@Override
				protected void onPostExecute(Bitmap result) {
					super.onPostExecute(result);
					if(result != null){
						img.setImageBitmap(result);
					}
				}
			}.executeOnExecutor(executors, HttpPath);
			return convertView;
		}
效果图: 可以看出是同步开始的,但是不是同步结束的。跟第一种 方式有些区别。

最后附上所有Demo:

activity如下:

package asynctask;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import mylog.Mylog;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import com.example.call.R;

public class GridViewAsynctaskActivity extends Activity {
	private GridView mGridView;
	private String[] urlPath = new String[]{  //数据源
			"http://img3.imgtn.bdimg.com/it/u=3921468129,634158244&fm=23&gp=0.jpg",
			"http://img4.imgtn.bdimg.com/it/u=1519979105,1747027397&fm=23&gp=0.jpg",
			"http://img3.imgtn.bdimg.com/it/u=3084720760,288869075&fm=23&gp=0.jpg",
			"http://www.touxiang.cn/uploads/20131231/31-032406_364.jpg",
			"http://img1.imgtn.bdimg.com/it/u=2642462636,439040675&fm=23&gp=0.jpg",
			"http://img5.imgtn.bdimg.com/it/u=3938127501,1933671504&fm=23&gp=0.jpg",
			"http://img2.imgtn.bdimg.com/it/u=1341923083,1900907467&fm=23&gp=0.jpg",
			"http://img3.imgtn.bdimg.com/it/u=3741892468,250959383&fm=23&gp=0.jpg",
			"http://img1.imgtn.bdimg.com/it/u=690802292,3622175025&fm=23&gp=0.jpg",
			"http://img1.imgtn.bdimg.com/it/u=4135556117,449468592&fm=23&gp=0.jpg",
			"http://img2.imgtn.bdimg.com/it/u=2750562473,158034435&fm=23&gp=0.jpg",
			"http://img4.imgtn.bdimg.com/it/u=391045188,3409015930&fm=23&gp=0.jpg",
			"http://img4.imgtn.bdimg.com/it/u=3026404928,664034360&fm=23&gp=0.jpg",
			"http://img4.imgtn.bdimg.com/it/u=1640876311,3279665449&fm=23&gp=0.jpg",
			"http://img3.imgtn.bdimg.com/it/u=2528101725,1306780188&fm=23&gp=0.jpg",
			"http://img5.imgtn.bdimg.com/it/u=3997415071,3054130748&fm=23&gp=0.jpg",
			"http://img5.imgtn.bdimg.com/it/u=2923667321,513117738&fm=23&gp=0.jpg",
			"http://img3.imgtn.bdimg.com/it/u=4131486482,3650592575&fm=23&gp=0.jpg",
			"http://img1.imgtn.bdimg.com/it/u=902623817,4158271644&fm=23&gp=0.jpg",
			"http://img1.imgtn.bdimg.com/it/u=2746922094,2107416533&fm=23&gp=0.jpg",
			"http://img5.imgtn.bdimg.com/it/u=2455377461,174243012&fm=23&gp=0.jpg"
	};
	Executor executors;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.gridview_asynctask_layout);
		mGridView = (GridView) findViewById(R.id.gridview_asynctask);
		/*AsynctaskGridViewAdapter adapter = new AsynctaskGridViewAdapter(this);
		adapter.setData(urlPath);
		mGridView.setAdapter(adapter);*/
		
		executors = new ThreadPoolExecutor(5, 150, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
		MoreAsynctaskGridViewAdapter adapter = new MoreAsynctaskGridViewAdapter(this);
		adapter.setData(urlPath);
		mGridView.setAdapter(adapter);
		
	}
	
	/*一次加载多张的适配器*/
	public class MoreAsynctaskGridViewAdapter extends BaseAdapter{
		private String[] strData;
		private LayoutInflater inflater;
		public MoreAsynctaskGridViewAdapter(Context context){
			inflater = LayoutInflater.from(context);
		}
		
		public void setData(String[] data){
			this.strData = data;
			notifyDataSetChanged();
		}
		@Override
		public int getCount() {
			return urlPath.length;
		}

		@Override
		public Object getItem(int position) {
			return urlPath[position];
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = inflater.inflate(R.layout.gridviewasynctask_item_layout, null);
			}
			final ImageView img = (ImageView) convertView.findViewById(R.id.item_img);
			String HttpPath = (String) getItem(position);
			/*启动异步任务下载图片,下载一张就设置一张。但是在滑动时会复用convertView,所以可能出项重复图片*/
			new AsyncTask<String, Void, Bitmap>() {
				@Override
				protected Bitmap doInBackground(String... params) {
					return getPicture(params[0]);
				}
				
				@Override
				protected void onPostExecute(Bitmap result) {
					super.onPostExecute(result);
					if(result != null){
						img.setImageBitmap(result);
					}
				}
			}.executeOnExecutor(executors, HttpPath);
			return convertView;
		}
	}
	
	/*一张一张加载的适配器*/
	public class AsynctaskGridViewAdapter extends BaseAdapter{
		private String[] strData;
		private Context mContext;
		private LayoutInflater inflater;
		public AsynctaskGridViewAdapter(Context context){
			this.mContext = context;
			inflater = LayoutInflater.from(context);
		}
		
		public void setData(String[] data){
			this.strData = data;
			notifyDataSetChanged();
		}
		@Override
		public int getCount() {
			return strData.length;
		}

		@Override
		public Object getItem(int position) {
			return strData[position];
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = inflater.inflate(R.layout.gridviewasynctask_item_layout, null);
			}
			final ImageView img = (ImageView) convertView.findViewById(R.id.item_img);
			String HttpPath = (String) getItem(position);
			/*启动异步任务下载图片,下载一张就设置一张。但是在滑动时会复用convertView,所以可能出项重复图片*/
			new AsyncTask<String, Void, Bitmap>() {
				@Override
				protected Bitmap doInBackground(String... params) {
					return getPicture(params[0]);
				}
				@Override
				protected void onPostExecute(Bitmap result) {
					super.onPostExecute(result);
					if(result != null){
						img.setImageBitmap(result);
					}
				}
			}.execute(HttpPath);
			return convertView;
		}
	}
	
	/*连接网络取数据*/
	public Bitmap getPicture(String URLpath){
		try {
			URL url = new URL(URLpath);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			InputStream in = conn.getInputStream();  //将对应地址的图片读入流
			Bitmap bitmap = BitmapFactory.decodeStream(in);   //将流转化为Bitmap对象。
			return bitmap;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

mainXML布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:padding="5dp">
    
    <GridView 
        android:id="@+id/gridview_asynctask"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:horizontalSpacing="5dp"
        android:verticalSpacing="5dp"
        android:numColumns="3"/>
</LinearLayout>

gridview子布局如下:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_img"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop" />





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值