农村四月闲人少,勤学苦攻把名扬。这篇文章主要讲述Android中用于kotlin的静态等价物,以避免处理程序内存泄漏相关的知识,希望能为你提供帮助。
当我在使用java之前在android中使用处理程序时,我会得到一条Android Studio lint消息,说我应该使用静态处理程序,否则会发生内存泄漏。由于Kotlin没有静态关键字,我该如何处理呢?这是我的班级:
class TaskDetailActivity : AppCompatActivity() {private val handlerComment = MyOptionMenuBarHandler(this)private fun setUpToolBar() {
handlerComment.sendEmptyMessage(0)
}private class MyOptionMenuBarHandler(activity: TaskDetailActivity) : Handler() {private val activity: WeakReference<
TaskDetailActivity>
= WeakReference<
TaskDetailActivity>
(activity)override fun handleMessage(msg: Message) {
//do the work
.....
}}
}
为了避免使用Kotlin泄漏内存,我需要做些什么特别的事情吗?
答案Lint告诉你将内部
Handler
类标记为static
,以防止编译器将封闭类的引用添加到Handler
实现中(默认情况下将其添加到所有内部非静态类),因为这可能会造成内存泄漏。【Android中用于kotlin的静态等价物,以避免处理程序内存泄漏】现在,Kotlin在
inner
和nested
类之间有概念。如果你在另一个类中声明一些类nested
,那么Foo
类是默认获得的。嵌套类没有对封闭类的隐式引用(在这方面它们类似于Java的内部静态类)。你的MyOptionMenuBarHandler
课正是如此。如果要将封闭类的引用添加到内部类,可以将其标记为
inner
。简而言之:
- Kotlin和Java在内部类方面有不同的默认值。在Kotlin中,内部类默认没有引用封闭类,在java中它没有。
- 如果要在Kotlin中隐式引用外部类,请将内部类标记为
inner
。 - 如果您不想在Java中使用此类引用,请将内部类标记为
static
。
推荐阅读
- SearchView在Android应用中泄漏内存
- [Android活动已泄漏com.android.internal.policy.impl.phonewindow $ decorview问题窗口
- 垃圾收集器没有像在Android应用程序中那样释放“捶打内存”
- Android FFmpeg(对atof,log2和log2f的未定义引用)
- 将RTSP流保存到android中的mp4文件
- 如何在java中使用ffmpeg-cli-wrapper使用ffmpeg下载m3u8文件()
- 自动将输出文件与输入文件匹配(Applescript x FFMPEG)
- 如何在Android中使用FFMPEG库将Youtube视频与MP4合并()
- QGuiApplication没有显示使用QPainter和QPdfWriter