我已经创建了一个UDP通信应用程序,它运行得非常好(到目前为止)。为了接收UDP数据包,我使用了一个AsyncTask扩展类。
为了清晰(和简洁),我将代码划分为单独的kotlin文件。
MainActivity.kt处理UI内容,比如按下按钮和创建对象。
LongTask.kt定义了扩展AsyncTask (UDP接收代码)的LongTask类。
我在一个LongTask按钮上创建一个实例,按下事件,使用以下内容
task = object : LongTask("$idx"){
override fun onProgressUpdate(vararg values: String?) {
super.onProgressUpdate(*values)
Log.d(TAG, "On UI thread")
}
}
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "")但是,上面的代码行以黄色高亮显示,并对可能的内存泄漏保持警告。
如何编写防泄漏代码以通过此警告?
发布于 2019-03-07 06:44:01
task = object : LongTask("$idx"){
override fun onProgressUpdate(vararg values: String?) {
super.onProgressUpdate(*values)
Log.d(TAG, "On UI thread")
}
}这一行将创建一个从LongTask类扩展的匿名内部类。内部类具有对其外部类的隐式引用,在本例中为MainActivity类。
如果活动是在异步任务完成之前完成的,则活动将被泄露或不被GC收集,因为异步任务仍然引用该活动。
解决方案:为了避免这种情况,我们应该使用WeakReference API。此外,LongTask是一个单独的类,因此我们需要定义一个接口来将数据传递回活动。
首先,声明一个接口。
OnProgressUpdateListener.kt
interface OnProgressUpdateListener {
fun onProgressUpdate(vararg values: String?)
}其次,修改异步任务类。只需关注OnProgressUpdateListener部分,因为我不知道您的类到底是什么样子。
LongTask.kt
class LongTask(val idx: String, listener: OnProgressUpdateListener) : AsyncTask<String, String, Unit>() {
private val mListener: WeakReference<OnProgressUpdateListener>? = WeakReference(listener)
override fun doInBackground(vararg params: String?) {
}
override fun onProgressUpdate(vararg values: String?) {
mListener?.get()?.onProgressUpdate(*values)
}
}最后,让活动实现OnProgressUpdateListener。
MainActivity.kt
class MainActivity : AppCompatActivity(), OnProgressUpdateListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
task = LongTask("$idx", this)
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "")
}
override fun onProgressUpdate(vararg values: String?) {
// Update your progress on UI thread here
Log.d(TAG, "On UI thread")
}
}https://stackoverflow.com/questions/55027516
复制相似问题