使用ProgressBar和AsyncTask 下载图片

使用ProgressBar和AsyncTask 下载图片android

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

一、在布局界面布局 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"/>
       ide

</LinearLayout>工具

--------------------------------------布局

二、MainActivity 类this

代码url

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[]>{code

  @Override//一、该 工具类 先 执行 onPreExecute  protected void onPreExecute() {   super.onPreExecute();   //显示 进度条   pb.setVisibility(View.VISIBLE);  }  //三、在 该 工具类里 在执行 onProgressUpdate 更新 进度条  @Override //用于 更新进度条的  方法  protected void onProgressUpdate(Integer... values) {   super.onProgressUpdate(values);   //在这里 接收 doInBackground 传递 要更新 进度条 的 多少   pb.setProgress(values[0]);  }  //二、该工具类 而后 执行 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;  }  //四、数据 下载 完后 最后 在 执行 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);   }  }   }}

相关文章
相关标签/搜索