异步asynctask
android異步任務(wù)詳解 AsynTask
android提供了一套專門用于異步處理的類。即:AynsTask類。使用這個(gè)類可以為耗時(shí)程序開辟一個(gè)新線程進(jìn)行處理,處理完時(shí)返回。
其實(shí),AsynTask類就是對(duì)Thread類的一個(gè)封裝,并且加入了一些新的方法。編程時(shí),兩者都可以實(shí)現(xiàn)同樣的功能。本文后面將對(duì)AsynTask和Thread進(jìn)行比較。
1、AsynTask類結(jié)構(gòu)
asysTask類主要用到的幾個(gè)內(nèi)部回調(diào)函數(shù)有:
doInBackGround()
onPreExecute()
onPostExecute()
onProgressUpdate()
正是這幾個(gè)回調(diào)函數(shù)構(gòu)成了AsynTask類的使用邏輯結(jié)構(gòu)。
注意:每個(gè)AsynTask子類必須至少復(fù)寫doInBackGround()方法。
2、回調(diào)邏輯關(guān)系
調(diào)用關(guān)系如下圖:
1>主線程調(diào)用AsynTask子類實(shí)例的execute()方法后,首先會(huì)調(diào)用onPreExecute()方法。onPreExecute()在主線程中運(yùn)行,可以用來寫一些開始提示代碼。
2>之后啟動(dòng)新線程,調(diào)用doInBackground()方法,進(jìn)行異步數(shù)據(jù)處理。
3>處理完畢之后異步線程結(jié)束,在主線程中調(diào)用onPostExecute()方法。onPostExecute()可以進(jìn)行一些結(jié)束提示處理。
補(bǔ)充:在doInBackground()方法異步處理的時(shí)候,如果希望通知主線程一些數(shù)據(jù)(如:處理進(jìn)度)。這時(shí),可以調(diào)用publishProgress()方法。這時(shí),主線程會(huì)調(diào)用AsynTask子類的onProgressUpdate()方法進(jìn)行處理。
3、各個(gè)函數(shù)間數(shù)據(jù)的傳遞
通過上面的調(diào)用關(guān)系,我們就可以大概看出一些數(shù)據(jù)傳遞關(guān)系。如下:
execute()向doInBackground()傳遞。
doInBackground()的返回值會(huì)傳遞給onPostExecute()。
publishProgress()向progressUpdate()傳遞。
?
要點(diǎn):為了調(diào)用關(guān)系明確及安全,AsynTask類在繼承時(shí)要傳入3個(gè)泛型。第一個(gè)泛型對(duì)應(yīng)execute()向doInBackground()的傳遞類型。第二個(gè)泛型對(duì)應(yīng)doInBackground()的返回類型和傳遞給onPostExecute()的類型。第三個(gè)泛型對(duì)應(yīng)publishProgress()向progressUpdate()傳遞的類型。
傳遞的數(shù)據(jù)都是對(duì)應(yīng)類型的數(shù)組,數(shù)組都是可變長的哦??梢愿鶕?jù)具體情況使用。
?
4、實(shí)例:
看了上面的內(nèi)容,應(yīng)該對(duì)asynTask類的使用邏輯有了了解。下面寫一個(gè)簡單的例子。
例子功能很簡單:activity中有1個(gè)textView和botton。當(dāng)點(diǎn)擊botton時(shí),異步改變textView的值,并且在相應(yīng)的回調(diào)函數(shù)執(zhí)行時(shí),用System.out.println()輸出值。
布局:
java代碼:
1 import android.app.Activity; 2 import android.os.AsyncTask; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.view.View.OnClickListener; 6 import android.widget.Button; 7 import android.widget.TextView; 8 9 public class AnsyTestActivity extends Activity { 10 /** Called when the activity is first created. */ 11 12 TextView text =null; 13 Button button=null; 14 String str=null; 15 AnsyTry anys=null; 16 double result=0; 17 18 @Override 19 public void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.main); 22 text=(TextView) findViewById(R.id.text); 23 button=(Button) findViewById(R.id.button); 24 str="wei"; 25 button.setOnClickListener(new OnClickListener() { 26 27 @Override 28 public void onClick(View v) { 29 // TODO Auto-generated method stub 30 anys=new AnsyTry(text); 31 anys.execute(str); 32 33 } 34 }); 35 } 36 37 38 class AnsyTry extends AsyncTask<String, TextView, Double>{ 39 40 TextView te=null; 41 42 public AnsyTry(TextView te) { 43 super(); 44 this.te = te; 45 } 46 47 @Override 48 protected Double doInBackground(String... params) { 49 // TODO Auto-generated method stub 50 double dou=0; 51 if(params[0].equals("wei")){ 52 System.out.println(Thread.currentThread().getName()+" recive wei"); 53 dou=100; 54 } 55 publishProgress(te); 56 return dou; 57 } 58 59 @Override 60 protected void onPostExecute(Double result) { 61 // TODO Auto-generated method stub 62 super.onPostExecute(result); 63 System.out.println("postExecute---double---"+result); 64 } 65 66 @Override 67 protected void onPreExecute() { 68 // TODO Auto-generated method stub\ 69 System.out.println("pretExecute------"); 70 super.onPreExecute(); 71 } 72 73 @Override 74 protected void onProgressUpdate(TextView... values) { 75 // TODO Auto-generated method stub 76 values[0].setText(values[0].getText()+"1"); 77 super.onProgressUpdate(values); 78 } 79 80 } 81 }5、總結(jié)
初次看到這個(gè)異步調(diào)用關(guān)系可能覺得很復(fù)雜,但其實(shí)熟悉了之后會(huì)發(fā)現(xiàn)這種結(jié)構(gòu)很好用。這種結(jié)構(gòu)將所有的線程通信都封裝成回調(diào)函數(shù),調(diào)用邏輯容易書寫。尤其是在異步處理結(jié)束之后,有回調(diào)函數(shù)進(jìn)行收尾處理。如果是使用Thread的run()方法,run()結(jié)束之后沒有返回值。所以必須要自己建立通信機(jī)制。但是,其實(shí)使用Handler+Thread機(jī)制其實(shí)完全可以替代AsynTask的這種調(diào)用機(jī)制。只要將Handler對(duì)象傳給Thread,就可以進(jìn)行方便的異步處理。且這種MVC模式結(jié)構(gòu)更加明顯,方便管理。所以我覺得,使用asynTask還是Handler+Thread結(jié)構(gòu),個(gè)人喜好吧。但是有一點(diǎn)可以明顯能感覺到得是,Handler+Thread適合進(jìn)行大框架的異步處理,而asynTask適用于小型簡單的異步處理。
?
?
轉(zhuǎn)自紅黑聯(lián)盟
轉(zhuǎn)載于:https://www.cnblogs.com/gm-lotus/p/3421477.html
總結(jié)
以上是生活随笔為你收集整理的异步asynctask的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# - 迭代器
- 下一篇: POJ1063 Flip and Shi