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