使用ProgressBar和AsyncTask 下载图片

使用ProgressBar和AsyncTask 下载图片

功能:一个下载按钮 从网络上下载图片 显示到该页面上
//记得配置联网权限

1、在布局界面布局 activity_main.xml

代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
<!-- ProgressBar的类型 style="?android:attr/progressBarStyleHorizontal"-->
    <ProgressBar
        android:id="@+id/progress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:visibility="gone"
         />
    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
   
     <Button
        android:id="@+id/bt_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下载图片"
        android:textSize="30sp"
        android:onClick="downLoad"/>
       

</LinearLayout>

--------------------------------------

2、MainActivity 类

代码

public class MainActivity extends Activity {
private ProgressBar pb;
private ImageView image;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  this.pb = (ProgressBar) this.findViewById(R.id.progress);
  this.image = (ImageView) this.findViewById(R.id.image);
 }
 //下载 按钮的 事件监听
 public void downLoad(View view){
  String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
  //启动 该工具类
  new MyAsyncTask().execute(url);
 }
 
 //第一个 参数 -- 要下载的 地址
 //第二个 参数 -- 设置 进度条参数为 整型
 //第三个参数  -- 得到 下载完 数据 返回来 的数据 类型
 class MyAsyncTask extends AsyncTask<String, Integer, byte[]>{

  @Override//1、该 工具类 先 执行 onPreExecute
  protected void onPreExecute() {
   super.onPreExecute();
   //显示 进度条
   pb.setVisibility(View.VISIBLE);
  }
  //3、在 该 工具类里 在执行 onProgressUpdate 更新 进度条
  @Override //用于 更新进度条的  方法
  protected void onProgressUpdate(Integer... values) {
   super.onProgressUpdate(values);
   //在这里 接收 doInBackground 传递 要更新 进度条 的 多少
   pb.setProgress(values[0]);
  }
  //2、该工具类 然后 执行 doInBackground
  @Override  //下载  图片数据
  protected byte[] doInBackground(String... params) {
   //准备 用HttpClient 方式  联网 下载 数据
   //接收 传递 过来 的下载 地址
   String url = params[0];
   //设置 GET请求
   HttpGet get = new HttpGet(url);
   //创建一个 HttpClient 对象
   HttpClient client = new DefaultHttpClient();
   try {
    //用 该 对象 把 请求 发送 给 服务端
    HttpResponse response = client.execute(get);
    //判断 服务器端 是否 成功 接收 请求
    if(response.getStatusLine().getStatusCode() == 200){
     //成功 请求 后 开始 下载 数据
    //1)在下载数据 时 如何 更新 进度条呢?
//进度条 计算 进度 的 公式  int len = (int)((count/(double) totalLength) * 100);
     //1 -- 先获取 要下载 文件的 长度
          long totalLength = response.getEntity().getContentLength();
          //2 -- 设置 进度条 一次 要 更新 多长
          //可以 在读一次 要下载的 循环里 设置 进度条 一次 要更新多长
          int count = 0;
          byte[] b = new byte[1024];
          int len = 0;
          BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent());
          ByteArrayOutputStream bos = new ByteArrayOutputStream();
     while((len = bis.read(b)) != -1){
      //把 数据 写入 内存中
      bos.write(b, 0, len);
      //刷新 一下
      bos.flush();
      //在这里 设置 进度条 每次 要更新 多长(要和下载内容匹配,
      //不然数据下完了 进度条 还没 加载完或 进度条加载完了 数据还没下载完)
      count+= len;
      //按照 公式 得到 进度条 每次 要 更新的 长度
      int progress_len = (int)((count/(double) totalLength) * 100);
      //利用 方法  publishProgress 跳到
      //更新 进度条 的 方法 onProgressUpdate
      publishProgress(progress_len);
     }
     bis.close();
     return bos.toByteArray();
    }
   } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return null;
  }
  //4、数据 下载 完后 最后 在 执行 onPostExecute
  //获得 下载的 数据
  @Override //接收 返回下载 的数据
  protected void onPostExecute(byte[] result) {
   super.onPostExecute(result);
   //在这里接收 下载 完 后 返回 来的 结果
   if(result != null){
    Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
    //设置 下载 图片 的 显示
    image.setImageBitmap(bitmap);
    //最后 关闭 进度条 -- 隐藏进度条
    pb.setVisibility(View.GONE);
   }
  }
  
 }
}

 

转载于:https://my.oschina.net/u/2542711/blog/603549

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值