public class MyAsyncTask extends AsyncTask<Void, Void, String> {
@Override protected String doInBackground(Void… params) {…}
@Override protected void onPostExecute(String result) {…}
}
}
此代码段的缺陷在于,代码会将线程处理对象 MyAsyncTask
声明为某个 Activity 的非静态内部类(或 Kotlin 中的内部类)。此声明会创建对封装 Activity
实例的隐式引用。因此,在线程处理工作完成之前,该对象一直包含对相应 Activity 的引用,导致所引用 Activity 的销毁出现延迟。 这种延迟进而会给内存带来更多压力。
此问题的直接解决方法是将过载的类实例定义为静态类,或在其自己的文件中定义,从而移除隐式引用。
另一个解决方法是将 AsyncTask
对象声明为静态嵌套类(或在 Kotlin 中移除内部限定符)。这样做可以消除隐式引用问题,因为静态嵌套类与内部类有所不同:内部类的实例要求对外部类的实例进行实例化,并且可直接访问封装实例的方法和字段。相反,静态嵌套类不需要引用封装类的实例,因此它不包含对外部类成员的引用。
public class MainActivity extends Activity {
// …
static public class MyAsyncTask extends AsyncTask<Void, Void, String> {
@Override protected String doInBackground(Void… params) {…}
@Override protected void onPostExecute(String result) {…}
}
}
线程和应用 Activity 生命周期
应用生命周期会影响线程处理在应用中的工作方式。您可能需要确定线程在 Activity 销毁后应不应该保留。您还应注意线程优先级与 Activity 是在前台运行还是在后台运行之间的关系。
保留线程
线程会在生成这些线程的 Activity 的生命周期过后继续保留。无论是否发生 Activity 创建或销毁事件&