MyTask task = new MyTask(); task.execute(url);
class MyTask extends AsyncTask<String, Integer, Bitmap> { // 下载前的操作(主) @Override protected void onPreExecute() { // 下载前需要显示进度条 dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("正在下载"); dialog.setMessage("请稍候"); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 水平进度条对话框 dialog.setMax(100); dialog.show(); super.onPreExecute(); } // 下载图片(子) @Override protected Bitmap doInBackground(String... params) { String url = params[0];// 获取url地址 HttpClient httpClient = new DefaultHttpClient(); // HttpClient对象 HttpGet httpGet = new HttpGet(url); // GET请求(url时uri的子类) try { HttpResponse response = httpClient.execute(httpGet); // 发送GET请求 // 判断响应的状态码是否为200 if (response.getStatusLine().getStatusCode() == 200) { // 真正的下载数据(图片) HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); // 获得输入流 long length = entity.getContentLength(); // 获取文件的总长度 ByteArrayOutputStream baos = new ByteArrayOutputStream();// 字节数组输出流(专用于保存网络上下载的数据) byte[] buffer = new byte[1024]; // 输入缓冲器 int ret, received = 0; // 接收到多少 // 屌丝的代码 while (true) { ret = is.read(buffer); // 真正读到多少字节(最后一次读到的值不一定是1024) if (ret < 0) { break; } // 把buffer的数据先保存到一个靠谱的地方 baos.write(buffer, 0, ret); received += ret; // 更新当前接收到的长度 int progress = (int) (100 * received / length); // 计算进度值 publishProgress(progress); // 发布最新的进度值 } // 大神的代码 // while((ret = is.read(buffer)) > 0) { // baos.write(buffer, 0, ret); // } byte[] data = baos.toByteArray(); // 流转字节数组 // 最后的最后,把字节数组转换成图片 return BitmapFactory.decodeByteArray(data, 0, data.length); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 发送请求(GET POST) return null; } // 发布更新的操作(主) @Override protected void onProgressUpdate(Integer... values) { dialog.setProgress(values[0]); super.onProgressUpdate(values); } // 下载后的操作(主) @Override protected void onPostExecute(Bitmap result) { imageview.setImageBitmap(result); // 下载后取消进度条 dialog.dismiss(); super.onPostExecute(result); } }