国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android AsyncTask實(shí)現(xiàn)異步處理任務(wù)的方法詳解

2019-12-12 02:59:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Android AsyncTask實(shí)現(xiàn)異步處理任務(wù)的方法詳解

在開(kāi)發(fā)Android應(yīng)用時(shí)必須遵守單線(xiàn)程模型的原則:Android UI操作并不是線(xiàn)程安全的并且這些操作必須在UI線(xiàn)程中執(zhí)行。

Android 單線(xiàn)程模型概念詳解://m.survivalescaperooms.com/article/112165.htm

在單線(xiàn)程模型中始終要記住兩條法則:

不要阻塞UI線(xiàn)程

確保只在UI線(xiàn)程中訪問(wèn)Android UI工具包

當(dāng)一個(gè)程序第一次啟動(dòng)時(shí),Android會(huì)同時(shí)啟動(dòng)一個(gè)對(duì)應(yīng)的主線(xiàn)程(Main Thread),主線(xiàn)程主要負(fù)責(zé)處理與UI相關(guān)的事件,如:用戶(hù)的按鍵事件,用戶(hù)接觸屏幕的事件以及屏幕繪圖事件,并把相關(guān)的事件分發(fā)到對(duì)應(yīng)的組件進(jìn)行處理。所以主線(xiàn)程通常又被叫做UI線(xiàn)程。

比如說(shuō)從網(wǎng)上獲取一個(gè)網(wǎng)頁(yè),在一個(gè)TextView中將其源代碼顯示出來(lái),這種涉及到網(wǎng)絡(luò)操作的程序一般都是需要開(kāi)一個(gè)線(xiàn)程完成網(wǎng)絡(luò)訪問(wèn),但是在獲得頁(yè)面源碼后,是不能直接在網(wǎng)絡(luò)操作線(xiàn)程中調(diào)用TextView.setText()的.因?yàn)槠渌€(xiàn)程中是不能直接訪問(wèn)主UI線(xiàn)程成員

Android提供了幾種在其他線(xiàn)程中訪問(wèn)UI線(xiàn)程的方法。

Activity.runOnUiThread( Runnable ) View.post( Runnable ) View.postDelayed( Runnable, long ) Hanlder 

 這些類(lèi)或方法同樣會(huì)使你的代碼很復(fù)雜很難理解。然而當(dāng)你需要實(shí)現(xiàn)一些很復(fù)雜的操作并需要頻繁地更新UI時(shí)這會(huì)變得更糟糕。

為了解決這個(gè)問(wèn)題,Android 1.5提供了一個(gè)工具類(lèi):AsyncTask,它使創(chuàng)建需要與用戶(hù)界面交互的長(zhǎng)時(shí)間運(yùn)行的任務(wù)變得更簡(jiǎn)單。不需要借助線(xiàn)程和Handler即可實(shí)現(xiàn)。

AsyncTask是抽象類(lèi).AsyncTask定義了三種泛型類(lèi)型 Params,Progress和Result。

◆Params 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請(qǐng)求的URL。

◆Progress 后臺(tái)任務(wù)執(zhí)行的百分比。

◆Result 后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String。

AsyncTask的執(zhí)行分為四個(gè)步驟,每一步都對(duì)應(yīng)一個(gè)回調(diào)方法,這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開(kāi)發(fā)者需要做的就是實(shí)現(xiàn)這些方法。

子類(lèi)化AsyncTask
實(shí)現(xiàn)AsyncTask中定義的下面一個(gè)或幾個(gè)方法

onPreExecute(), 該方法將在執(zhí)行實(shí)際的后臺(tái)操作前被UI thread調(diào)用。可以在該方法中做一些準(zhǔn)備工作,如在界面上顯示一個(gè)進(jìn)度條。

doInBackground(Params...), 將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運(yùn)行在后臺(tái)線(xiàn)程中。這里將主要負(fù)責(zé)執(zhí)行那些很耗時(shí)的后臺(tái)計(jì)算工作。可以調(diào)用 publishProgress方法來(lái)更新實(shí)時(shí)的任務(wù)進(jìn)度。該方法是抽象方法,子類(lèi)必須實(shí)現(xiàn)。

onProgressUpdate(Progress...),在publishProgress方法被調(diào)用后,UI thread將調(diào)用這個(gè)方法從而在界面上展示任務(wù)的進(jìn)展情況,例如通過(guò)一個(gè)進(jìn)度條進(jìn)行展示。

onPostExecute(Result), 在doInBackground 執(zhí)行完成后,onPostExecute 方法將被UI thread調(diào)用,后臺(tái)的計(jì)算結(jié)果將通過(guò)該方法傳遞到UI thread.

為了正確的使用AsyncTask類(lèi),以下是幾條必須遵守的準(zhǔn)則:

1) Task的實(shí)例必須在UI thread中創(chuàng)建

2) execute方法必須在UI thread中調(diào)用

3) 不要手動(dòng)的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個(gè)方法

4) 該task只能被執(zhí)行一次,否則多次調(diào)用時(shí)將會(huì)出現(xiàn)異常

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

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;   @Override  public 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> {   // 可變長(zhǎng)的輸入?yún)?shù),與AsyncTask.exucute()對(duì)應(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();     }   @Override   protected String doInBackground(String... params) {     try{      HttpClient client = new DefaultHttpClient();     // params[0]代表連接的url     HttpGet 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)的長(zhǎng)度,調(diào)用publishProgress()更新進(jìn)度        publishProgress((int) ((count / (float) length) * 100));       }        // 讓線(xiàn)程休眠100ms       Thread.sleep(100);      }      s = new String(baos.toByteArray());    }     // 返回結(jié)果     return s;    } catch(Exception e) {     e.printStackTrace();     }     return null;    }    @Override   protected void onCancelled() {    super.onCancelled();   }    @Override   protected void onPostExecute(String result) {    // 返回HTML頁(yè)面的內(nèi)容    message.setText(result);    pdialog.dismiss();   }    @Override   protected void onPreExecute() {    // 任務(wù)啟動(dòng),可以在這里顯示一個(gè)對(duì)話(huà)框,這里簡(jiǎn)單處理    message.setText(R.string.task_started);   }    @Override   protected void onProgressUpdate(Integer... values) {    // 更新進(jìn)度     System.out.println(""+values[0]);     message.setText(""+values[0]);     pdialog.setProgress(values[0]);   }    }  } 

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 郓城县| 清丰县| 永福县| 嘉鱼县| 柘荣县| 柏乡县| 泰兴市| 永清县| 道真| 镇平县| 南充市| 佛教| 杭锦后旗| 虹口区| 新沂市| 沈阳市| 宁城县| 永清县| 驻马店市| 海盐县| 周至县| 固阳县| 衡南县| 赤城县| 永修县| 乌鲁木齐市| 华容县| 黑龙江省| 周至县| 额敏县| 葫芦岛市| 金湖县| 伊通| 甘肃省| 寿阳县| 临漳县| 雅安市| 沽源县| 延津县| 黑水县| 双柏县|