編輯: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:
- package waterlife.ipc.demo;
- import java.io.InputStream;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.net.URLConnection;
- import android.app.Activity;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.widget.ProgressBar;
- public class myAsyncTask extends Activity {
- static ProgressBar pb;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- pb = (ProgressBar)findViewById(R.id.ProgressBar01);
- Download dl = new Download();
- dl.execute();
- }
- public class Download extends AsyncTask<Void, Integer, Void>
- {
- @Override
- protected Void doInBackground(Void... params) {
- // TODO Auto-generated method stub
- int totalSize = 0;
- InputStream recevier = null;
- try {
- URL myUrl = new URL("http://bbs.nju.edu.cn/");
- URLConnection urlConn = myUrl.openConnection();
- totalSize = urlConn.getContentLength();
- recevier = urlConn.getInputStream();
- byte[] b =new byte[256];
- int length = 0;
- length += recevier.read(b);
- while(length < totalSize)
- {
- length += recevier.read(b);
- publishProgress((int)(length*100/totalSize));
- }
- recevier.close();
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }catch (Exception ex)
- {
- ex.printStackTrace();
- }
- return null;
- }
- protected void onProgressUpdate(Integer... progress) {
- pb.setProgress(progress[0]);
- }
- }
- }
在這個Demo中只有第二和第三步,只有第二個參數params,是一個整型參量,把下載數據包的進度更新給UI Progressbar顯示。
另外,使用AsyncTask需要注意以下幾點:
1. AsyncTask的實例只能在UI線程中創建;
2. dl.execute()方法只能在UI線程中調用,並且只能調用一次,否則會拋異常。
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
繪制圓環其實很簡單,有大概以下三種思路. 這裡先說網上提到的一種方法。思路是先繪制內圓,然後繪制圓環(圓環的寬度就是paint設置的paint.setStroke
知識點: 1.使用SQL Helper創建數據庫 2.數據的增刪查改(PRDU:Put、Read、Delete、Update) 背景知識: 上篇文章學習了andr
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放