我們都知道,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