日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AsyncTask的用法

發(fā)布時間:2024/1/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AsyncTask的用法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AsyncTask的用法

????? 在開發(fā)Android應(yīng)用時必須遵守單線程模型的原則: Android UI操作并不是線程安全的并且這些操作必須在UI線程中執(zhí)行。在單線程模型中始終要記住兩條法則:
1. 不要阻塞UI線程
2. 確保只在UI線程中訪問Android UI工具包
???? ?當(dāng)一個程序第一次啟動時,Android會同時啟動一個對應(yīng)的主線程(Main Thread),主線程主要負責(zé)處理與UI相關(guān)的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,并把相關(guān)的事件分發(fā)到對應(yīng)的組件進行處理。所以主線程通常又被叫做UI線程。
???? ?比如說從網(wǎng)上獲取一個網(wǎng)頁,在一個TextView中將其源代碼顯示出來,這種涉及到網(wǎng)絡(luò)操作的程序一般都是需要開一個線程完成網(wǎng)絡(luò)訪問,但是在獲得頁面源碼后,是不能直接在網(wǎng)絡(luò)操作線程中調(diào)用TextView.setText()的.因為其他線程中是不能直接訪問主UI線程成員 。

android提供了幾種在其他線程中訪問UI線程的方法。
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
這些類或方法同樣會使你的代碼很復(fù)雜很難理解。然而當(dāng)你需要實現(xiàn)一些很復(fù)雜的操作并需要頻繁地更新UI時這會變得更糟糕。

???? 為了解決這個問題,Android 1.5提供了一個工具類:AsyncTask,它使創(chuàng)建需要與用戶界面交互的長時間運行的任務(wù)變得更簡單。相對來說AsyncTask更輕量級一些,適用于簡單的異步處理,不需要借助線程和Handler即可實現(xiàn)。
AsyncTask是抽象類.AsyncTask定義了三種泛型類型 Params,Progress和Result。
  Params 啟動任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請求的URL。
  Progress 后臺任務(wù)執(zhí)行的百分比。
  Result 后臺執(zhí)行任務(wù)最終返回的結(jié)果,比如String。

???? AsyncTask的執(zhí)行分為四個步驟,每一步都對應(yīng)一個回調(diào)方法,這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開發(fā)者需要做的就是實現(xiàn)這些方法。
  1) 子類化AsyncTask
  2) 實現(xiàn)AsyncTask中定義的下面一個或幾個方法
  ?? onPreExecute(), 該方法將在執(zhí)行實際的后臺操作前被UI thread調(diào)用。可以在該方法中做一些準(zhǔn)備工作,如在界面上顯示一個進度條。
  ? doInBackground(Params...), 將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運行在后臺線程中。這里將主要負責(zé)執(zhí)行那些很耗時的后臺計算工作。可以調(diào)用 publishProgress方法來更新實時的任務(wù)進度。該方法是抽象方法,子類必須實現(xiàn)。
  ? onProgressUpdate(Progress...),在publishProgress方法被調(diào)用后,UI thread將調(diào)用這個方法從而在界面上展示任務(wù)的進展情況,例如通過一個進度條進行展示。
  ? onPostExecute(Result), 在doInBackground 執(zhí)行完成后,onPostExecute 方法將被UI thread調(diào)用,后臺的計算結(jié)果將通過該方法傳遞到UI thread.

為了正確的使用AsyncTask類,以下是幾條必須遵守的準(zhǔn)則:
  1) Task的實例必須在UI thread中創(chuàng)建
  2) execute方法必須在UI thread中調(diào)用
  3) 不要手動的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法
  4) 該task只能被執(zhí)行一次,否則多次調(diào)用時將會出現(xiàn)異常
????? doInBackground方法和onPostExecute的參數(shù)必須對應(yīng),這兩個參數(shù)在AsyncTask聲明的泛型參數(shù)列表中指定,第一個為doInBackground接受的參數(shù),第二個為顯示進度的參數(shù),第第三個為doInBackground返回和onPostExecute傳入的參數(shù)。


從網(wǎng)上獲取一個網(wǎng)頁,在一個TextView中將其源代碼顯示出來

package test.list; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.ArrayList;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient;import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;public class NetworkActivity extends Activity{private TextView message;private Button open;private EditText url;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.network);message= (TextView) findViewById(R.id.message);url= (EditText) findViewById(R.id.url);open= (Button) findViewById(R.id.open);open.setOnClickListener(new View.OnClickListener() {public void onClick(View arg0) {connect();}});}private void connect() {PageTask task = new PageTask(this);task.execute(url.getText().toString());}class PageTask extends AsyncTask<String, Integer, String> {// 可變長的輸入?yún)?shù),與AsyncTask.exucute()對應(yīng)ProgressDialog pdialog;public PageTask(Context context){pdialog = new ProgressDialog(context, 0); pdialog.setButton("cancel", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int i) {dialog.cancel();}});pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {public void onCancel(DialogInterface dialog) {finish();}});pdialog.setCancelable(true);pdialog.setMax(100);pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pdialog.show();}@Overrideprotected String doInBackground(String... params) {try{HttpClient client = new DefaultHttpClient();// params[0]代表連接的urlHttpGet get = new HttpGet(params[0]);HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();long length = entity.getContentLength();InputStream is = entity.getContent();String s = null;if(is != null) {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buf = new byte[128];int ch = -1;int count = 0;while((ch = is.read(buf)) != -1) {baos.write(buf, 0, ch);count += ch;if(length > 0) {// 如果知道響應(yīng)的長度,調(diào)用publishProgress()更新進度publishProgress((int) ((count / (float) length) * 100));}// 讓線程休眠100msThread.sleep(100);}s = new String(baos.toByteArray()); }// 返回結(jié)果return s;} catch(Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onCancelled() {super.onCancelled();}@Overrideprotected void onPostExecute(String result) {// 返回HTML頁面的內(nèi)容message.setText(result);pdialog.dismiss(); }@Overrideprotected void onPreExecute() {// 任務(wù)啟動,可以在這里顯示一個對話框,這里簡單處理message.setText(R.string.task_started);}@Overrideprotected void onProgressUpdate(Integer... values) {// 更新進度System.out.println(""+values[0]);message.setText(""+values[0]);pdialog.setProgress(values[0]);}}}

?

總結(jié)

以上是生活随笔為你收集整理的AsyncTask的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。