国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中使用AsyncTask實現文件下載以及進度更新提示

2019-12-12 04:17:12
字體:
來源:轉載
供稿:網友

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

Params啟動任務執行的輸入參數,比如,HTTP請求的URL。

Progress后臺任務執行的百分比。

Result后臺執行任務最終返回的結果,比如String。

通過用AsyncTask實現文件下載以及進度更新提示的演示動圖:

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

首先我們簡單介紹AsyncTask的執行步驟:

AsyncTask的執行分為四個步驟,每一步對應一個回調方法,我們需要的就是實現這些方法。

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

(2)實現AsyncTask中定義的下面一個或幾個方法

四個步驟方法分別為:

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

(2)dolnBackground(Params…):將在onPreExecute之后執行,運行在后臺線程中。負責執行耗時工作。可以調用publishProgress方法來更新實時任務進度。

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

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

效果實現代碼示例:

第一步: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實現代碼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的更新標記   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,傳入需要執行的內容(圖片地址)     new DownLoad().execute("http://cdnq.duitang.com/uploads/item///_jWNmx.thumb._.jpeg");   }   class DownLoad extends AsyncTask<String,Integer,String>{   //在執行實際的后臺操作前被UI Thread調用     @Override     protected void onPreExecute() {       super.onPreExecute();       //準備下載前的初始進度       progress.setProgress();     }   //在onPreExecute執行,該方法運行在后臺線程中     @Override     protected String doInBackground(String... params) {       try {         URL url = new URL(params[]);         //獲取連接         HttpURLConnection connection = (HttpURLConnection) url.openConnection();         //獲取下載文件的大小         contentLen = connection.getContentLength();         //根據下載文件大小設置進度條最大值(使用標記區別實時進度更新)         publishProgress(PROGRESS_MAX,contentLen);         //循環下載(邊讀取邊存入)         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();           //實時更新下載進度(使用標記區別最大值)           publishProgress(UPDATE,len);           //演示下載的圖片太小,網速太快,休眠毫秒,方便大家觀察           Thread.sleep();         }         bos.close();         bis.close();       } catch (Exception e) {         e.printStackTrace();       }       return "下載完成";     }   //在publishProgress被調用后,UI thread會調用這個方法     @Override     protected void onProgressUpdate(Integer... values) {       super.onProgressUpdate(values);       switch (values[]){         case PROGRESS_MAX:           progress.setMax(values[]);           break;         case UPDATE:           progress.incrementProgressBy(values[]);           //獲取下載進度百分比并更新textview           int i=(progress.getProgress()*)/contentLen;           tv.setText("下載進度為:"+i+"%");           break;       }     }   //doInBackground方法執行完后被UI thread執行     @Override     protected void onPostExecute(String s) {       super.onPostExecute(s);       progress.setVisibility(View.GONE);       tv.setText(s);     }   } }

最后強調一下AsyncTask的設計準則:

(1)AsyncTask的實例必須在UlThread中創建。

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

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

(4)該Task只能被執行一次,否則多次調用時將會出現異常。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新疆| 盐山县| 大竹县| 凤冈县| 利辛县| 南溪县| 大新县| 永宁县| 通山县| 宝山区| 治县。| 同心县| 德江县| 华阴市| 修水县| 若尔盖县| 大姚县| 牡丹江市| 当阳市| 北安市| 鄯善县| 南昌县| 凌海市| 汉沽区| 东兴市| 三江| 黄浦区| 柞水县| 五台县| 来安县| 海安县| 丽水市| 那坡县| 泸州市| 邹城市| 顺昌县| 濮阳县| 修文县| 蓝山县| 富平县| 鄂托克前旗|