使用AsyncTask下载图片并显示进度条

AsyncTask下载图片并显示下载进度,异步类AsyncTask配合进度条,简练!
public class AsyncTaskActivity2 extends Activity {
	private Button btnDown;//图片框
	private ImageView ivImage;//图片URL
	private static String image_path = "http://www.wfu.edu.cn/page/main1406/images/nav2.jpg";

	//进度对话框
	private ProgressDialog dialog;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.asynctask_activity);
		btnDown = (Button) findViewById(R.id.btnDown);
		ivImage = (ImageView) findViewById(R.id.ivSinaImage);
        //新建一个对话框,不显示
		dialog = new ProgressDialog(this);
		dialog.setTitle("提示");
		dialog.setMessage("正在下载,请稍后...");
		dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//带有水平滚动条
		dialog.setCancelable(false);//不能
        //单击按钮后执行AsyncTask,并传入图片URL
		btnDown.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				//  执行异步任务
				new MyTask().execute(image_path);//启动AsyncTask,参数类型为异步类的第一个参数的类型
			}
		});
	}
    //创建一个内部类,用来下载图片
	public class MyTask extends AsyncTask<String, Integer, Bitmap> {
		@Override
		protected void onPreExecute() {//启动异步类后首先运行,可以设置
			super.onPreExecute();
			dialog.show();//显示对话框
		}

         //第二步,一般进行复杂处理
		@Override
		protected Bitmap doInBackground(String... params) {//最重要,复杂处理,后台,接收execute传来的参数
			Bitmap bitmap = null;  //二进制图片 
			//字节数组输出流
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			InputStream inputStream = null;//字节输入流
			try {
				HttpClient httpClient = new DefaultHttpClient();//创建一个Http客户端
				HttpGet httpGet = new HttpGet(params[0]);//发送请求
				HttpResponse httpResponse = httpClient.execute(httpGet);//返回
				if (httpResponse.getStatusLine().getStatusCode() == 200) {//成功
					inputStream = httpResponse.getEntity().getContent();//得到返回内容作为输入流
					long file_length = httpResponse.getEntity().getContentLength();//文件长度
					int len = 0;
					byte[] data = new byte[1024];//每次读取的字节
					int total_length = 0;
					// 以字节的方式读取图片数据
					while ((len = inputStream.read(data)) != -1) {
						total_length += len;
						// 计算进度
						int values = (int) ((total_length / (float) file_length) * 100);
						// 发布进度信息
						publishProgress(values);//发布进度,AsyncTask第二个参数类型,触发onProgressUpdate更新进度条
						outputStream.write(data, 0, len);//写入输出流
					}
					byte[] result=outputStream.toByteArray();//将字节数组输出流转换为字节数组
					//生成二进制图片
					bitmap=BitmapFactory.decodeByteArray(result, 0, result.length);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if (inputStream != null) {
						inputStream.close();
					}
				} catch (Exception e2) {
				}
			}
			return bitmap;
		}
		//当有 publishProgress(value)发来的数据时触发,更新UI
		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			// 设置进度对话框的进度值
			dialog.setProgress(values[0]);//更新进度条,运行在UI
		}
		//第四步
		@Override
		protected void onPostExecute(Bitmap result) {//下载结束后,隐藏对话框
			super.onPostExecute(result);
			dialog.dismiss();
			ivImage.setImageBitmap(result); //更新UI,显示图片,运行在UI
		}
		
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值