<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>