本節(jié)引言:本節(jié)給大家?guī)淼氖茿ndroid給我們提供的一個輕量級的用于處理異步任務的類:AsyncTask,,我們一般是 繼承AsyncTask,然后在類中實現(xiàn)異步操作,,然后將異步執(zhí)行的進度,反饋給UI主線程~ 好吧,,可能有些概念大家不懂,,覺得還是有必要講解下多線程的概念,那就先解釋下一些概念性的東西吧,! 1.相關(guān)概念1)什么是多線程:
舉個簡單的例子: 你掛著QQ,突然想去聽歌,,你需要把QQ關(guān)掉,,然后再去啟動XX播放器嗎?答案是否定的,,我們直接打開播放器 放歌就好,QQ還在運行著,,是吧,!這就是簡單的多線程~在實際開發(fā)中,也有這樣的例子,,比如應用正在運行,, 發(fā)現(xiàn)新版本了,想后臺更新,,這個時候一般我們會開辟出一條后臺線程,,用于下載新版本的apk,但是這個時候 我們還可以使用應用中的其他功能,!這就是多線程的使用例子~ 2)同步與異步的概念:
3) Android為很么要引入異步任務
以上的種種原因都說明了Android引入異步任務的意義,當然實現(xiàn)異步也不可以不用到我們本節(jié)講解 的AsyncTask,,我們可以自己開辟一個線程,完成相關(guān)操作后,,通過下述兩種方法進行UI更新:
2.AsyncTask全解析:1)為什么要用AsyncTask?答:我們可以用上述兩種方法來完成我們的異步操作,,加入要我們寫的異步操作比較多,,或者較為繁瑣, 難道我們new Thread()然后用上述方法通知UI更新么,?程序員都是比較喜歡偷懶的,,既然官方給我 們提供了AsyncTask這個封裝好的輕量級異步類,,為什么不用呢?我們通過幾十行的代碼就可以完成 我們的異步操作,,而且進度可控,;相比起Handler,AsyncTask顯得更加簡單,,快捷~當然,這只適合 簡單的異步操作,,另外,,實際異步用的最多的地方就是網(wǎng)絡操作,,圖片加載,數(shù)據(jù)傳輸?shù)?,AsyncTask 暫時可以滿足初學者的需求,,謝謝小應用,但是到了公司真正做項目以后,,我們更多的使用第三發(fā)的 框架,比如Volley,OkHttp,android-async-http,XUtils等很多,,后面進階教程我們會選1-2個框架進行 學習,,當然你可以自己找資料學習學習,,但是掌握AsyncTask還是很有必要的,! 2)AsyncTask的基本結(jié)構(gòu):AsyncTask是一個抽象類,,一般我們都會定義一個類繼承AsyncTask然后重寫相關(guān)方法~ 官方API:AsyncTask
3.AsyncTask使用示例:
實現(xiàn)效果圖: 布局文件:activity.xml: <LinearLayout xmlns:android="http://schemas./apk/res/android" xmlns:tools="http://schemas./tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MyActivity"> <TextView android:id="@+id/txttitle" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!--設置一個進度條,并且設置為水平方向--> <ProgressBar android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/pgbar" style="?android:attr/progressBarStyleHorizontal"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnupdate" android:text="更新progressBar"/> </LinearLayout> 定義一個延時操作,,用于模擬下載: public class DelayOperator { //延時操作,用來模擬下載 public void delay() { try { Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace();; } } } 自定義AsyncTask: public class MyAsyncTask extends AsyncTask<Integer,Integer,String> { private TextView txt; private ProgressBar pgbar; public MyAsyncTask(TextView txt,ProgressBar pgbar) { super(); this.txt = txt; this.pgbar = pgbar; } //該方法不運行在UI線程中,主要用于異步操作,通過調(diào)用publishProgress()方法 //觸發(fā)onProgressUpdate對UI進行操作 @Override protected String doInBackground(Integer... params) { DelayOperator dop = new DelayOperator(); int i = 0; for (i = 10;i <= 100;i+=10) { dop.delay(); publishProgress(i); } return i + params[0].intValue() + ""; } //該方法運行在UI線程中,可對UI控件進行設置 @Override protected void onPreExecute() { txt.setText("開始執(zhí)行異步線程~"); } //在doBackground方法中,每次調(diào)用publishProgress方法都會觸發(fā)該方法 //運行在UI線程中,可對UI控件進行操作 @Override protected void onProgressUpdate(Integer... values) { int value = values[0]; pgbar.setProgress(value); } } MainActivity.java: public class MyActivity extends ActionBarActivity { private TextView txttitle; private ProgressBar pgbar; private Button btnupdate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txttitle = (TextView)findViewById(R.id.txttitle); pgbar = (ProgressBar)findViewById(R.id.pgbar); btnupdate = (Button)findViewById(R.id.btnupdate); btnupdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar); myTask.execute(1000); } }); } } 本節(jié)小結(jié):
|
|
來自: 小飛苑 > 《android基礎》