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

首頁 > 系統 > Android > 正文

Android中使用AsyncTask實現下載文件動態更新進度條功能

2019-10-22 18:30:09
字體:
來源:轉載
供稿:網友

1. 泛型

AysncTask<Params, Progress, Result>

Params:啟動任務時傳入的參數,通過調用asyncTask.execute(param)方法傳入。

Progress:后臺任務執行的進度,若不用顯示進度條,則不需要指定。

Result:后臺任務結束時返回的結果。

2. 重要方法

doInBackground(Params... params):必須重寫的方法,后臺任務就在這里執行,會開啟一個新的線程。params為啟動任務時傳入的參數,參數個數不定。

onPreExecute():在主線程中調用,在后臺任務開啟前的操作在這里進行,例如顯示一個進度條對話框。

onPostExecute(Result result):當后臺任務結束后,在主線程中調用,處理doInBackground()方法返回的結果。

onProgressUpdate(Progress... values):當在doInBackground()中調用publishProgress(Progress... values)時,返回主線程中調用,這里的參數個數也是不定的。

onCancelled():取消任務。

asynctask,用法解析,android,下載文件動態更新進度條

3. 注意事項

(1)execute()方法必須在主線程中調用;

(2)AsyncTask實例必須在主線程中創建;

(3)不要手動調用doInBackground()、onPreExecute()、onPostExecute()、onProgressUpdate()方法;

(4)注意防止內存泄漏,在doInBackground()方法中若出現對Activity的強引用,可能會造成內存泄漏。

4. 下載文件動態更新進度條(未封裝)

布局:

<?xml version="1.0" encoding="utf-8"?><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"  android:padding="20dp"  tools:context="com.studying.asynctaskdemo.MainActivity">  <ProgressBar    android:id="@+id/progressBar"    style="?android:progressBarStyleHorizontal"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:progress="0" />  <Button    android:id="@+id/download"    android:layout_width="match_parent"    android:layout_height="50dp"    android:layout_marginTop="20dp"    android:text="@string/start_btn" />  <TextView    android:id="@+id/status"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginTop="20dp"    android:text="@string/waiting" /></LinearLayout>

Activity:

public class MainActivity extends Activity {  private static final String FILE_NAME = "test.pdf";//下載文件的名稱  private static final String PDF_URL = "http://clfile.imooc.com/class/assist/118/1328281/AsyncTask.pdf";  private ProgressBar mProgressBar;  private Button mDownloadBtn;  private TextView mStatus;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    setListener();  }  private void initView() {    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);    mDownloadBtn = (Button) findViewById(R.id.download);    mStatus = (TextView) findViewById(R.id.status);  }  private void setListener() {    mDownloadBtn.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        //AsyncTask實例必須在主線程創建        DownloadAsyncTask asyncTask = new DownloadAsyncTask();        asyncTask.execute(PDF_URL);      }    });  }  /**   * 泛型:   * String:傳入參數為文件下載地址   * Integer:下載過程中更新ProgressBar的進度   * Boolean:是否下載成功   */  private class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {    private String mFilePath;//下載文件的保存路徑    @Override    protected Boolean doInBackground(String... params) {      if (params != null && params.length > 0) {        String pdfUrl = params[0];        try {          URL url = new URL(pdfUrl);          URLConnection urlConnection = url.openConnection();          InputStream in = urlConnection.getInputStream();          int contentLength = urlConnection.getContentLength();//獲取內容總長度          mFilePath = Environment.getExternalStorageDirectory() + File.separator + FILE_NAME;          //若存在同名文件則刪除          File pdfFile = new File(mFilePath);          if (pdfFile.exists()) {            boolean result = pdfFile.delete();            if (!result) {              return false;            }          }          int downloadSize = 0;//已經下載的大小          byte[] bytes = new byte[1024];          int length = 0;          OutputStream out = new FileOutputStream(mFilePath);          while ((length = in.read(bytes)) != -1) {            out.write(bytes, 0, length);            downloadSize += length;            publishProgress(downloadSize / contentLength * 100);          }          in.close();          out.close();        } catch (IOException e) {          e.printStackTrace();          return false;        }      } else {        return false;      }      return true;    }    @Override    protected void onPreExecute() {      super.onPreExecute();      mDownloadBtn.setText("下載中");      mDownloadBtn.setEnabled(false);      mStatus.setText("下載中");      mProgressBar.setProgress(0);    }    @Override    protected void onPostExecute(Boolean aBoolean) {      super.onPostExecute(aBoolean);      mDownloadBtn.setText("下載完成");      mStatus.setText(aBoolean ? "下載完成" + mFilePath : "下載失敗");    }    @Override    protected void onProgressUpdate(Integer... values) {      super.onProgressUpdate(values);      if (values != null && values.length > 0) {        mProgressBar.setProgress(values[0]);      }    }  }}

5. 下載文件動態更新進度條(封裝)

Activity:

public class MainActivity extends Activity {  private static final String FILE_NAME = "test.pdf";  private static final String PDF_URL = "http://clfile.imooc.com/class/assist/118/1328281/AsyncTask.pdf";  private ProgressBar mProgressBar;  private Button mDownloadBtn;  private TextView mStatus;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    setListener();  }  private void initView() {    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);    mDownloadBtn = (Button) findViewById(R.id.download);    mStatus = (TextView) findViewById(R.id.status);  }  private void setListener() {    mDownloadBtn.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        String localPath = Environment.getExternalStorageDirectory() + File.separator + FILE_NAME;        DownloadHelper.download(PDF_URL, localPath, new DownloadHelper.OnDownloadListener() {          @Override          public void onStart() {            mDownloadBtn.setText("下載中");            mDownloadBtn.setEnabled(false);            mStatus.setText("下載中");            mProgressBar.setProgress(0);          }          @Override          public void onSuccess(File file) {            mDownloadBtn.setText("下載完成");            mStatus.setText(String.format("下載完成:%s", file.getPath()));          }          @Override          public void onFail(File file, String failInfo) {            mDownloadBtn.setText("開始下載");            mDownloadBtn.setEnabled(true);            mStatus.setText(String.format("下載失敗:%s", failInfo));          }          @Override          public void onProgress(int progress) {            mProgressBar.setProgress(progress);          }        });      }    });  }}

DownloadHelper:

class DownloadHelper {  static void download(String url, String localPath, OnDownloadListener listener) {    DownloadAsyncTask task = new DownloadAsyncTask(url, localPath, listener);    task.execute();  }  private static class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {    private String mFailInfo;    private String mUrl;    private String mFilePath;    private OnDownloadListener mListener;    DownloadAsyncTask(String mUrl, String mFilePath, OnDownloadListener mListener) {      this.mUrl = mUrl;      this.mFilePath = mFilePath;      this.mListener = mListener;    }    @Override    protected Boolean doInBackground(String... params) {        String pdfUrl = mUrl;        try {          URL url = new URL(pdfUrl);          URLConnection urlConnection = url.openConnection();          InputStream in = urlConnection.getInputStream();          int contentLength = urlConnection.getContentLength();          File pdfFile = new File(mFilePath);          if (pdfFile.exists()) {            boolean result = pdfFile.delete();            if (!result) {              mFailInfo = "存儲路徑下的同名文件刪除失敗!";              return false;            }          }          int downloadSize = 0;          byte[] bytes = new byte[1024];          int length;          OutputStream out = new FileOutputStream(mFilePath);          while ((length = in.read(bytes)) != -1) {            out.write(bytes, 0, length);            downloadSize += length;            publishProgress(downloadSize / contentLength * 100);          }          in.close();          out.close();        } catch (IOException e) {          e.printStackTrace();          mFailInfo = e.getMessage();          return false;        }      return true;    }    @Override    protected void onPreExecute() {      super.onPreExecute();      if (mListener != null) {        mListener.onStart();      }    }    @Override    protected void onPostExecute(Boolean aBoolean) {      super.onPostExecute(aBoolean);      if (mListener != null) {        if (aBoolean) {          mListener.onSuccess(new File(mFilePath));        } else {          mListener.onFail(new File(mFilePath), mFailInfo);        }      }    }    @Override    protected void onProgressUpdate(Integer... values) {      super.onProgressUpdate(values);      if (values != null && values.length > 0) {        if (mListener != null) {          mListener.onProgress(values[0]);        }      }    }  }  interface OnDownloadListener{    void onStart();    void onSuccess(File file);    void onFail(File file, String failInfo);    void onProgress(int progress);  }}

總結

以上所述是小編給大家介紹的Android中使用AsyncTask實現下載文件動態更新進度條功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 华宁县| 徐州市| 安达市| 双柏县| 崇明县| 勃利县| 银川市| 四川省| 聊城市| 兴仁县| 安平县| 芦溪县| 吉水县| 大埔县| 湖南省| 青州市| 翁牛特旗| 孙吴县| 松潘县| 长沙市| 盐津县| 闻喜县| 文山县| 镇坪县| 锡林浩特市| 阳东县| 白城市| 汝阳县| 抚松县| 新泰市| 宣恩县| 犍为县| 团风县| 梓潼县| 子洲县| 梁平县| 灯塔市| 潍坊市| 安陆市| 凯里市| 光山县|