Android高级面试题之SDK源码分析:通过线程提升性能,你所不知道的Android原生开发的现状

本文讨论了Android中AsyncTask的内存泄漏问题及其解决方案,强调了线程生命周期管理和优先级的重要性。同时提到了线程处理的辅助类如AsyncTask、HandlerThread和ThreadPoolExecutor的适用场景,以及如何避免性能问题。此外,还提及了Android开发面临的挑战和面试要求。
摘要由CSDN通过智能技术生成

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 创建或销毁事件&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值