首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过内存泄漏警告(创建扩展AsyncTask的sigleton类)

如何通过内存泄漏警告(创建扩展AsyncTask的sigleton类)
EN

Stack Overflow用户
提问于 2019-03-06 16:10:00
回答 1查看 51关注 0票数 0

我已经创建了一个UDP通信应用程序,它运行得非常好(到目前为止)。为了接收UDP数据包,我使用了一个AsyncTask扩展类。

为了清晰(和简洁),我将代码划分为单独的kotlin文件。

MainActivity.kt处理UI内容,比如按下按钮和创建对象。

LongTask.kt定义了扩展AsyncTask (UDP接收代码)的LongTask类。

我在一个LongTask按钮上创建一个实例,按下事件,使用以下内容

代码语言:javascript
运行
复制
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, "")

但是,上面的代码行以黄色高亮显示,并对可能的内存泄漏保持警告。

如何编写防泄漏代码以通过此警告?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-07 06:44:01

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
interface OnProgressUpdateListener {
    fun onProgressUpdate(vararg values: String?)
}

其次,修改异步任务类。只需关注OnProgressUpdateListener部分,因为我不知道您的类到底是什么样子。

LongTask.kt

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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")
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55027516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档