使用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);   }  }   }}

相關文章
相關標籤/搜索