Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android Framework系列之IPC(二)

Android Framework系列之IPC(二)

編輯:Android開發實例

對於Android的IPC來說,除了Handler和Looper之外,還有另外一種簡便的方法來實現多線程的通信,那就是AsyncTask。AsyncTask是一個異步的方法,它允許背景運算並把結果更新到前台的UI線程之上。要實現一個AsyncTask主要有4個步驟,但並不是每一個步驟都是必需的。

 

這四個步驟是:

onPreExecute() 執行背景運算前任務的初始化;

doInBackground(Params...)這是AsyncTask最核心的函數,即是做背景運算;它在第一步完成之後被調用,通常在這步中還會調用方法publishProgress(Progress...)將運算結果更新到UI主線程上;

onProgressUpdate(Progress...)是在publishProgress(Progress...)調用之後被執行的,需要注意到是這步執行的時間是未定的,通常在這一步中會更新相關UI;

onPostExecute(Result)這一步同樣是和UI相關,將運算結果Result當作參數傳遞給UI。

 

大家可能已經注意到AsyncTask除了四大步之外,還有三個重要的參數:AsyncTask<Params, Progress, Result>。三個參數為通用類型,Params是傳給任務初始化的參數,Progress是做背景運算過程中和UI交互的參數,Result是背景運算傳遞給UI的結果。

 

利用好這四大步和三個參數,我們可以方便的寫出上節例子中的Demo:

 

  1. package waterlife.ipc.demo;  
  2.  
  3. import java.io.InputStream;  
  4. import java.net.MalformedURLException;  
  5. import java.net.URL;  
  6. import java.net.URLConnection;  
  7.  
  8. import android.app.Activity;  
  9. import android.os.AsyncTask;  
  10. import android.os.Bundle;  
  11. import android.widget.ProgressBar;  
  12.  
  13. public class myAsyncTask extends Activity {  
  14.     static ProgressBar pb;  
  15.     /** Called when the activity is first created. */ 
  16.     @Override 
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.         pb = (ProgressBar)findViewById(R.id.ProgressBar01);  
  21.         Download dl = new Download();  
  22.         dl.execute();  
  23.     }  
  24.         
  25.     public class Download extends AsyncTask<Void, Integer, Void>  
  26.     {  
  27.  
  28.         @Override 
  29.         protected Void doInBackground(Void... params) {  
  30.             // TODO Auto-generated method stub  
  31.             int totalSize = 0;  
  32.             InputStream recevier = null;  
  33.             try {  
  34.                 URL myUrl = new URL("http://bbs.nju.edu.cn/");  
  35.  
  36.                 URLConnection urlConn = myUrl.openConnection();  
  37.                 totalSize = urlConn.getContentLength();  
  38.                 recevier = urlConn.getInputStream();  
  39.                 byte[] b =new byte[256];  
  40.                 int length = 0;  
  41.                 length += recevier.read(b);  
  42.                 while(length < totalSize)  
  43.                 {  
  44.                     length += recevier.read(b);  
  45.                     publishProgress((int)(length*100/totalSize));  
  46.                 }  
  47.                 recevier.close();  
  48.             } catch (MalformedURLException e) {  
  49.                 // TODO Auto-generated catch block  
  50.                 e.printStackTrace();  
  51.             }catch (Exception ex)  
  52.             {  
  53.                 ex.printStackTrace();  
  54.             }  
  55.             return null;  
  56.         }  
  57.           
  58.         protected void onProgressUpdate(Integer... progress) {  
  59.             pb.setProgress(progress[0]);  
  60.         }  
  61.     }  

在這個Demo中只有第二和第三步,只有第二個參數params,是一個整型參量,把下載數據包的進度更新給UI Progressbar顯示。

 

另外,使用AsyncTask需要注意以下幾點:

1. AsyncTask的實例只能在UI線程中創建;

2. dl.execute()方法只能在UI線程中調用,並且只能調用一次,否則會拋異常。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved