AsyncTask中各個函數詳細的調用過程,初步實現異步任務

<a target=_blank href="http://www.cnblogs.com/tianzhijiexian/p/3884695.html?utm_source=tuicool&utm_medium=referral" target="_blank"><span style="font-size:48px;">原文地址</span></a>


<a target=_blank href="http://www.cnblogs.com/tianzhijiexian/p/3884695.html?utm_source=tuicool&utm_medium=referral" target="_blank">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線程中
     */
    @Override
    protected 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);更新進度
     * 可以有變長的參數,對個數無要求
     */
    @Override
    protected 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線程中
     */
    @Override
    protected 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線程中
     */
    @Override
    protected 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 {

    @Override
    protected 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做參數用的,可以傳任意個參數
    }
}
</a>



發佈了24 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章