异步任务Asynctask实现图片墙

来源:互联网 发布:西安 java 软件公司 编辑:程序博客网 时间:2024/06/03 02:39

前面学习了通过异步任务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>@Overridepublic 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>() {@Overrideprotected Bitmap doInBackground(String... params) {return getPicture(params[0]);}@Overrideprotected 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();}@Overridepublic int getCount() {return urlPath.length;}@Overridepublic Object getItem(int position) {return urlPath[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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>() {@Overrideprotected Bitmap doInBackground(String... params) {return getPicture(params[0]);}@Overrideprotected 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;@Overrideprotected 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();}@Overridepublic int getCount() {return urlPath.length;}@Overridepublic Object getItem(int position) {return urlPath[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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>() {@Overrideprotected Bitmap doInBackground(String... params) {return getPicture(params[0]);}@Overrideprotected 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();}@Overridepublic int getCount() {return strData.length;}@Overridepublic Object getItem(int position) {return strData[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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>() {@Overrideprotected Bitmap doInBackground(String... params) {return getPicture(params[0]);}@Overrideprotected 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" />





0 0
原创粉丝点击