AsyncTask中各个函数详细的调用过程,初步实现异步任务
生活随笔
收集整理的這篇文章主要介紹了
AsyncTask中各个函数详细的调用过程,初步实现异步任务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?AsyncTask內部類可能會產生內存泄露的問題
解決上述內部類可能引起的內存泄露問題的方法
- 將AsyncTask或者Thread的子類作為單獨的類文件,不持有Activity的強引用
- 將AsyncTask或者Thread的子類使用static修飾,則不會隱式持有Activity的強引用
- 如果是匿名內部類,則需要將其對象設置成成員屬性,使用static修飾就不會隱式持有Activity的強引用。
異步任務是我們經常要使用的東西,android中提供了一套解決方案,從異步任務的開始到結束,相當完善。本實例沒有任何應用價值,只是說明了AsyncTask中各個函數的調用順序。
具體的結果看下面的Log輸出即可:
異步任務類:
AsyncTaskTest.java
package com.kale.asynctask;import java.net.URL;import android.R.integer; import android.os.AsyncTask;/*** @author:Jack Tony* @tips :* 必須在UI線程中創建AsyncTask實例* 必須在UI線程中執行AsyncTask的execute方法* 每個AsyncTask只能執行一次,不能多次調用。要用的話再生成一個對象再執行即可* @date :2014-8-1*/ /*** @param * execute傳來的參數是第三個參數* 第一個參數的類型提供給publishProgress做參數(可變長的數組)* 第二個參數定義的是onProgressUpdate的參數類型(可變長的數組)* 第三個參數作為doInBackground返回值的類型,返回給onPostExecute做形參*/ public class AsyncTaskTest extends AsyncTask<URL, Integer, String>{/* (非 Javadoc)* @see android.os.AsyncTask#onPreExecute()* 開始異步任務前會調用此方法,這個方法執行在UI線程中*/@Overrideprotected void onPreExecute() {System.out.println("onPreExecute 開始執行");System.out.println("onPreExecute 執行初始化操作,執行UI操作");System.out.println("onPreExecute 所在的線程:"+Thread.currentThread().getName());System.out.println("onPreExecute 執行完畢,開始執行doInBackground");}/* * @see android.os.AsyncTask#doInBackground(Params[]),里面就是個可變長度的數組* 里面寫后臺線程要完成任務,里面可以調用publishProgress(values);更新進度* 可以有變長的參數,對個數無要求*/@Overrideprotected String doInBackground(URL... params) {System.out.println("doInBackground 開始執行");System.out.println("doInBackground 執行耗時的異步任務");System.out.println("doInBackground 所在的線程:"+Thread.currentThread().getName());System.out.println("doInBackground 執行耗時的異步任務");System.out.println("doInBackground 中調用publishProgress更新下視圖");for (int i = 0; i < 3; i++) {publishProgress(i);//這里傳的值是給onProgressUpdate做參數的,這里傳的也是一個可變長的數組try {Thread.sleep(100);} catch (InterruptedException e) {// TODO 自動生成的 catch 塊 e.printStackTrace();}}System.out.println("doInBackground 執行完畢,準備執行onPostExecute");return "doInBackground執行完后的結果";}/* (非 Javadoc)* @see android.os.AsyncTask#onProgressUpdate(Progress[])* 在doInBackground中調用publishProgress時會執行這個方法,主要用來更新進度* 執行在UI線程中*/@Overrideprotected void onProgressUpdate(Integer... values) {System.out.println("onProgressUpdate 開始執行,更新UI視圖,一般是進度");System.out.println("onProgressUpdate 執行第【"+(values[0].intValue()+1)+"】次更新操作");System.out.println("onProgressUpdate 所在的線程:"+Thread.currentThread().getName());System.out.println("onProgressUpdate 執行完畢,更新操作結束");}/* (非 Javadoc)* @see android.os.AsyncTask#onPostExecute(java.lang.Object)* 在doInBackground執行完后,系統將doInBackground方法返回的參數作為形參傳遞到這個方法中* 它執行在UI線程中*/@Overrideprotected void onPostExecute(String result) {System.out.println("onPostExecute 開始執行,更新UI視圖");System.out.println("onPostExecute 接收到的處理結果是:【"+result+"】");System.out.println("onPostExecute 執行收尾操作");System.out.println("onPostExecute 所在的線程:"+Thread.currentThread().getName());System.out.println("onPostExecute 執行完畢,異步任務完全結束");} }?
MainActivity.java
package com.kale.asynctask;import java.net.MalformedURLException; import java.net.URL;import android.app.Activity; import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);AsyncTaskTest async = new AsyncTaskTest();URL url = null;try {url = new URL("http://www.baidu.com");} catch (MalformedURLException e) {e.printStackTrace();}async.execute(url,url);//這里傳進去的數據是給doInBackground做參數用的,可以傳任意個參數 } }?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的AsyncTask中各个函数详细的调用过程,初步实现异步任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好用的侧边栏菜单/面板jQuery插件
- 下一篇: Curator selector