欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中使用AsyncTask實(shí)現(xiàn)文件下載以及進(jìn)度更新提示

 更新時間:2016年12月20日 08:21:52   作者:潘侯爺  
AsyncTask,它使創(chuàng)建需要與用戶界面交互的長時間運(yùn)行的任務(wù)變得更簡單,本篇文章主要介紹了Android中使用AsyncTask實(shí)現(xiàn)文件下載以及進(jìn)度更新提示,有興趣的可以了解一下。

Android提供了一個工具類:AsyncTask,它使創(chuàng)建需要與用戶界面交互的長時間運(yùn)行的任務(wù)變得更簡單。相對Handler來說AsyncTask更輕量級一些,適用于簡單的異步處理,不需要借助線程和Handter即可實(shí)現(xiàn)。AsyncTask是抽象類。AsyncTask定義了三種泛型類型Params,Progress和Result:

Params啟動任務(wù)執(zhí)行的輸入?yún)?shù),比如,HTTP請求的URL。

Progress后臺任務(wù)執(zhí)行的百分比。

Result后臺執(zhí)行任務(wù)最終返回的結(jié)果,比如String。

通過用AsyncTask實(shí)現(xiàn)文件下載以及進(jìn)度更新提示的演示動圖:

本次真機(jī)演示的下載目錄為Download文件夾,首先進(jìn)入Download文件夾,沒有圖片文件,下載完成后,再次查看,可以看到本次演示的下載圖片

首先我們簡單介紹AsyncTask的執(zhí)行步驟:

AsyncTask的執(zhí)行分為四個步驟,每一步對應(yīng)一個回調(diào)方法,我們需要的就是實(shí)現(xiàn)這些方法。

(1)首先定義一個類繼承AsyncTask

(2)實(shí)現(xiàn)AsyncTask中定義的下面一個或幾個方法

四個步驟方法分別為:

(1)onPreExecute():被UIThread調(diào)用,該方法用來做一些準(zhǔn)備工作,如在界面上顯示一個進(jìn)度條。

(2)dolnBackground(Params…):將在onPreExecute之后執(zhí)行,運(yùn)行在后臺線程中。負(fù)責(zé)執(zhí)行耗時工作??梢哉{(diào)用publishProgress方法來更新實(shí)時任務(wù)進(jìn)度。

(3)onProgressUpdate(Progress…):在publishProgress方法被調(diào)用后,UIThread將調(diào)用該方法在界面上展示任務(wù)的進(jìn)展情況,例如通過一個進(jìn)度條進(jìn)行展示。

(4)onPostExecute(Result):在dolnBackground執(zhí)行完成后,onPostExecute方法將被UIThread調(diào)用,后臺的計算結(jié)果將通過該方法傳遞到UIThread。

效果實(shí)現(xiàn)代碼示例:

第一步:Layout中Activity的布局文件activity_main.xml

 <?xml version="." encoding="utf-"?>
 <LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/activity_main"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context="com.example.administrator.asynctask.MainActivity">
   <TextView
     android:id="@+id/tv"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="panhouye!"
     android:textSize="sp"/>
   <ProgressBar
     android:id="@+id/progress"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
     android:visibility="visible"/>
   <Button
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:onClick="image"
     android:text="下載圖片"/>
 </LinearLayout>

第二步:Java實(shí)現(xiàn)代碼MainActivity.java文件

 import android.os.AsyncTask;
 import android.os.Environment;
 import android.support.v.app.AppCompatActivity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
 /**
 * Created by panchengjia on //.
 */
 public class MainActivity extends AppCompatActivity {
 //聲明publishProgress的更新標(biāo)記
   private static final int PROGRESS_MAX = X;
   private static final int UPDATE = X;
   private TextView tv;
   ProgressBar progress;
   int contentLen;//聲明要下載的文件總長
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     tv = (TextView) findViewById(R.id.tv);
     progress = (ProgressBar) findViewById(R.id.progress);
   }
   public void image(View view){
   //啟用AsyncTask,傳入需要執(zhí)行的內(nèi)容(圖片地址)
     new DownLoad().execute("http://cdnq.duitang.com/uploads/item///_jWNmx.thumb._.jpeg");
   }
   class DownLoad extends AsyncTask<String,Integer,String>{
   //在執(zhí)行實(shí)際的后臺操作前被UI Thread調(diào)用
     @Override
     protected void onPreExecute() {
       super.onPreExecute();
       //準(zhǔn)備下載前的初始進(jìn)度
       progress.setProgress();
     }
   //在onPreExecute執(zhí)行,該方法運(yùn)行在后臺線程中
     @Override
     protected String doInBackground(String... params) {
       try {
         URL url = new URL(params[]);
         //獲取連接
         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         //獲取下載文件的大小
         contentLen = connection.getContentLength();
         //根據(jù)下載文件大小設(shè)置進(jìn)度條最大值(使用標(biāo)記區(qū)別實(shí)時進(jìn)度更新)
         publishProgress(PROGRESS_MAX,contentLen);
         //循環(huán)下載(邊讀取邊存入)
         BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new
             File(Environment.getExternalStorageDirectory()+"/Download/ss.jpg")));
         int len =-;
         byte[] bytes = new byte[];
         while((len=bis.read(bytes))!=-){
           bos.write(bytes,,len);
           bos.flush();
           //實(shí)時更新下載進(jìn)度(使用標(biāo)記區(qū)別最大值)
           publishProgress(UPDATE,len);
           //演示下載的圖片太小,網(wǎng)速太快,休眠毫秒,方便大家觀察
           Thread.sleep();
         }
         bos.close();
         bis.close();
       } catch (Exception e) {
         e.printStackTrace();
       }
       return "下載完成";
     }
   //在publishProgress被調(diào)用后,UI thread會調(diào)用這個方法
     @Override
     protected void onProgressUpdate(Integer... values) {
       super.onProgressUpdate(values);
       switch (values[]){
         case PROGRESS_MAX:
           progress.setMax(values[]);
           break;
         case UPDATE:
           progress.incrementProgressBy(values[]);
           //獲取下載進(jìn)度百分比并更新textview
           int i=(progress.getProgress()*)/contentLen;
           tv.setText("下載進(jìn)度為:"+i+"%");
           break;
       }
     }
   //doInBackground方法執(zhí)行完后被UI thread執(zhí)行
     @Override
     protected void onPostExecute(String s) {
       super.onPostExecute(s);
       progress.setVisibility(View.GONE);
       tv.setText(s);
     }
   }
 }

最后強(qiáng)調(diào)一下AsyncTask的設(shè)計準(zhǔn)則:

(1)AsyncTask的實(shí)例必須在UlThread中創(chuàng)建。

(2)execute方法必須在UlThread中調(diào)用。

(3)不要手動的調(diào)用onPreExecute(),onPostExecute(Result),dolnBackground(Params…),onProgressUpdate(Progress…)這幾個方法。

(4)該Task只能被執(zhí)行一次,否則多次調(diào)用時將會出現(xiàn)異常。

(5)AsyncTask不能完全取代線程,在一些邏輯較為復(fù)雜或者需要在后臺反復(fù)執(zhí)行的邏輯就可能需要線程來實(shí)現(xiàn)了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論