您的位置:首页 > 理论基础 > 计算机网络

AsyncTask--实现从网络下载一张图片的功能

2010-02-27 11:02 363 查看
1、Android 中的AsyncTask的使用心得



在android程序中一定不能阻塞UI线程,否则很容易就会弹出no respond 的对话框,导致程序退出。为了避免这种情况,一般需要较长时间执行的任务都放在线程中去执行,如从网上下载图片在界面的某个区域显示。但是使用线程回导致cpu开销过大,并且当线程管理不好时也会弹出no respond框。android提供了AsyncTask类用来处理这种情况;例如需要下载图片,然后在songImagButton中显示,下载的逻辑在songImageButton的initImage方法中。

Java代码

private class DrawImageTask extends AsyncTask<Void,Integer,Void>{

//更新图片显示区域,显示图片

@Override

protected void onPostExecute(Void params) {

// TODO Auto-generated method stub

songImageButton.invalidate();

this.cancel(false);

}

//下载图片

@Override

protected Void doInBackground(Void... params) {

// TODO Auto-generated method stub

songImageButton.initImage();

return null;

}



}

一般在doInBackground中执行后台的逻辑,如下载图片或其他需要耗时长的任务,onPostExecute方法用来对界面进行操作。如果后台的逻辑有返回值,则由doInBackground返回然后传入onPostExecute方法,然后更新界面。doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。

当然我个人认为AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。





2、从网络上下载一张图片

package com.dream.androidresearch;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class AsynTaskTest extends Activity {
	private String imageUrl = "http://hiphotos.baidu.com/baidu/pic/item/7d8aebfebf3f9e125c6008d8.jpg";
	private String param = "";
	
	private ProgressBar pbDownload;
	private Button btnDownload;
	private ImageView ivDownload;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		this.setContentView(R.layout.asyntaks);
		
		pbDownload = (ProgressBar) this.findViewById(R.id.pb_download);
		btnDownload = (Button) this.findViewById(R.id.btn_download);
		ivDownload = (ImageView) this.findViewById(R.id.iv_download);
		
		pbDownload.setVisibility(View.GONE);
		
		btnDownload.setOnClickListener(new OnClickListener()
			{
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					new myAsynTask().execute(param);
				}
			
			});
		
	}
	Bitmap getImageFromNetwork() { 
		URL myFileUrl = null; 
		Bitmap bitmap = null; 
		try { 
			myFileUrl = new URL(imageUrl); 
		} catch (MalformedURLException e) { 
			e.printStackTrace(); 
		} 
		try { 
			HttpURLConnection conn = (HttpURLConnection) myFileUrl 
			.openConnection(); 
			conn.setDoInput(true); 
	
			conn.connect(); 
			InputStream is = conn.getInputStream(); 
	
			bitmap = BitmapFactory.decodeStream(is); 
	
			is.close(); 
		} catch (IOException e) { 
			e.printStackTrace(); 
		} 
		System.out.println(bitmap==null); 
		System.out.println(myFileUrl.toString()); 
		return bitmap; 
	} 
	
	
	class myAsynTask extends AsyncTask<String, Integer, Bitmap>
	{
		@Override
		protected Bitmap doInBackground(String... params) {
			// TODO Auto-generated method stub
//			return null;
			
			Bitmap bitmap = getImageFromNetwork();
			return bitmap;
			
		}
		@Override
		protected void onPostExecute(Bitmap result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			
			if(result != null)
				ivDownload.setImageBitmap(result);
			else
				ivDownload.setBackgroundResource(R.drawable.icon);
			pbDownload.setVisibility(View.GONE);
			
		}
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			
			pbDownload.setVisibility(View.VISIBLE);
			pbDownload.setProgress(0);
			
		}
		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
			
			pbDownload.setProgress(values[0]);
		}
		
		
		
	}
	
}


注意,需要在 manifest.xml 中添加网络权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: