歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中異步加載類AsyncTask的使用

我們都知道,Android為了安全方面的考慮,是不允許線程對UI線程進行直接操作的。

而如果我們想通過線程對界面進行操作,有如下的幾種方法:

在子線程中提供了5中方法來實現與UI線程的交互:

第一種方法:Activity.runUiThread(Runnable);

第二種方法:View.post(Runnable);

第三種方法:View.postDelayed(Runnable);

第四種方法:Handler、Message、Looper

第五種方法:AsyncTask

 前面的幾種方法就不多說了,本文主要介紹的就是最常用的AsyncTask的使用。

空談是沒用的,下面做一個例子來實現AsyncTask與UI線程的交互的例子——下載文件並顯示下載進度

當doInBackground執行結束的時候會返回一個結果,這個結果如果重寫了onPostExecute方法的會以參數的方式自動傳入。

首先我們創建一個DownLoadAsyncTask 類,該類繼承AsyncTask類。雖然我沒有看過AsyncTask的源碼,但是也能猜測是AsyncTask應該是一個抽象類,其中定義了抽象的方法doInBackground();

當我們繼承這個類的時候,就會默認的重寫doInBackground()方法了。

當然,這裡為了顯示效果,我們把著各類中所有的方法都顯示出來。(右鍵該類的頁面->source->override->選擇全部的方法->OK,方法就會被添加進來了)

添加進來之後應該就會有下面代碼的效果了。

當然,你也許會發現,你的AsyncTask後面的參數怎麼和我不一樣呢?

當然不會一樣,因為我這個已經被我改過了。下面來講一講這些參數的含義吧。

AsyncTask的<>中的三個參數,按照順序,第一個為doInBackground輸入的參數類型,可以傳入集合,比如String[]。第二個參數為顯示進度的參數,第三個為doInBackground的返回類型以及onPostExecute的輸入類型。

講完了輸入參數,接著就是各個方法的含義了。

這個按照加載時的先後順序來講。

第一個被執行的方法是onPreExecute();

這個方法主要的作用就是進行一些初始化的操作,比如這個方法中可以執行一些當前類中成員變量的實例化等等。就把這個方法想象成我們經常用到的init();方法吧。

其次被執行的方法是doInBackground();

這個就是這個類當中執行的主體了。比如我們例子當中直接添加一個下載的方法。

最後被執行的方法是onPostExecute();

我們可以做一些收尾工作,比如顯示結果以及跳出彈出框提示下載完成等等。

// 第一個為doInBackground接受的參數類型,第二個為顯示進度的參數,第三個為doInBackground返回和onPostExecute傳入的參數。
public class DownLoadAsyncTask extends AsyncTask<String, Integer, File> {
 private TextView showmsg;

 public void setTextView(TextView showmsg) {
  this.showmsg = showmsg;
 }

 @Override
 protected File doInBackground(String... params) {
  // TODO Auto-generated method stub
  // 輸入參數為String[]類型的,params[0]代表下載的文件的名稱,params[1],代表下載文件的地址,params[2]代表存儲到本地的地址
  // 下載文件
  File file = downLoadFile(params[0], params[1]);
  // 對下載好的文件進行改名操作
  return file;
 }

 @Override
 protected void onCancelled() {
  // TODO Auto-generated method stub
  super.onCancelled();
 }

 @Override
 protected void onPostExecute(File file) {
  // TODO Auto-generated method stub
  super.onPostExecute(file);
  // 傳入的參數file即為doInBackground返回的file對象,處理該對象。我們暫時就獲取到這個file的地址然後打印到頁面上並提示下載完成吧。
  String path = file.getAbsolutePath();
  if(file==null||!file.exists()){
   showmsg.setText("文件下載失敗");
   return;
  }
  showmsg.setText("文件地址為:"+path);
 }

 @Override
 protected void onPreExecute() {
  // TODO Auto-generated method stub
  super.onPreExecute();
 }

 @Override
 protected void onProgressUpdate(Integer... values) {
  // TODO Auto-generated method stub
  super.onProgressUpdate(values);
 }


}

Android異步下載圖片並且緩存圖片到本地 http://www.linuxidc.com/Linux/2014-04/100444.htm

Android異步任務(AsyncTask)的設計思想 http://www.linuxidc.com/Linux/2014-02/97104.htm

Android 異步加載圖片分析 http://www.linuxidc.com/Linux/2013-06/85369.htm

Android 中加載網絡資源時的優化 緩存和異步機制 http://www.linuxidc.com/Linux/2013-06/85364.htm

Android短彩信幻燈片異步加載機制 http://www.linuxidc.com/Linux/2013-03/81528.htm

Android-自定義TextView和異步加載圖片的實現 http://www.linuxidc.com/Linux/2012-12/76331.htm

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved