AsyncTask 的简单使用,给定一个uri地址下载图片,并显示进度条

AsyncTask 的简单使用,给定一个uri地址下载图片,并显示进度条
代码如下:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class AsyncTask_TestActivity extends Activity {
	private ProgressDialog dialog;
	ImageView image;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		dialog = new ProgressDialog(AsyncTask_TestActivity.this);
		dialog.setTitle("提示");
		dialog.setMessage("正在下载,请稍候...");
		dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		dialog.setCancelable(false);
		
		image = (ImageView) findViewById(R.id.imageView1);
		Button b = (Button) findViewById(R.id.button1);
		b.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				new MyTask()
						.execute("http://b.hiphotos.baidu.com/image/w%3D2048/sign=5e82a4e40846f21fc9345953c21c6a60/cb8065380cd791231e957e6baf345982b2b780bc.jpg");
			}
		});

	}

	/**
	 * 使用异步任务规则: 1>.声明一个类继承AsyncTask,标注三个参数的类型。 2>.第一个参数表示要执行的任务通常是网络的路径。
	 * 第二个参数表示进度的刻度。 第三个参数表示任务执行的返回结果。
	 */
	public class MyTask extends AsyncTask<String, Integer, Bitmap> {
		/**
		 * 任务初始化时执行方法
		 */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			Log.i("asynctask", "onPreExecute()");
			
			dialog.show();
		}

		/**
		 * 主要完成耗时操作
		 */
		@Override
		protected Bitmap doInBackground(String... uri) {
			Bitmap bitmap = null;

			HttpClient httpClient = new DefaultHttpClient();
			HttpGet httpGet = new HttpGet(uri[0]);
			ByteArrayOutputStream outStream = new ByteArrayOutputStream();
			InputStream inStream = null;
			try {
				HttpResponse httpResponse = httpClient.execute(httpGet);
				if (httpResponse.getStatusLine().getStatusCode() == 200) {
					//得到输入流
					inStream = httpResponse.getEntity().getContent();
					byte[] datas = new byte[1024];
					int len = 0;
					long read_all_len=0;
					//先得到文件总大小
					long fileSize=httpResponse.getEntity().getContentLength();
					while ((len = inStream.read(datas)) != -1) {
						
						//计算进度条刻度
						read_all_len+=len;
						publishProgress((int)(read_all_len/(float)fileSize*100));
						// 图片写入缓存区
						outStream.write(datas, 0, len);
					}
					// 最后把图片写出去
					// outStream提供一个方法,可以把httpResponse转换成byte数组。
					byte[] result = outStream.toByteArray();
					bitmap = BitmapFactory.decodeByteArray(result, 0,
							result.length);
				}
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (outStream != null) {
					try {
						outStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}

			return bitmap;
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			dialog.setProgress(values[0]);
		}

		/**
		 * 更新ui
		 */
		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			image.setImageBitmap(result);
			dialog.dismiss();
		}

	}
}

效果如下:

AsyncTask 的简单使用,给定一个uri地址下载图片,并显示进度条_第1张图片



你可能感兴趣的:(AsyncTask 的简单使用,给定一个uri地址下载图片,并显示进度条)