因此,我对Kotlin和Android还是个新手. 我写了一个应用程序,它完全按照我想要的方式工作,除了 它给了我一个编译器警告:
'Do not place Android context classes in static fields; this is a memory leak'
在一个文件中,我有:
lateinit var appContext: Context private set
lateinit var appRez: Resources private set
class HackJob : Application() {
override fun onCreate() {
super.onCreate()
appContext = applicationContext
appRez = resources
val clientthread = ClientThread() //these three can be collapsed into one line
val maThread = Thread(clientthread)
maThread.start()
}
internal class ClientThread : Runnable {
ContextCompat.getMainExecutor(appContext).execute /* command = */ {
MainActivity.otv.setBackgroundColor(Color.RED)
MainActivity.osb.visibility = View.VISIBLE
}
}
}
在另一个文件中:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// create a value that is linked to a button called (id) start in the layout
val tv: TextView = findViewById(R.id.rcvdData)
val startButton = findViewById<Button>(R.id.start)
...
otv = tv
osb = startButton
...
}
companion object {
lateinit var otv: TextView
lateinit var osb: Button
}
}
正如我所说,它似乎工作得很好,即使屏幕旋转. 做了我想让它做的事!
我真的是在泄露内存吗? 我应该对泄漏警告有多大的担忧?
当我旋转屏幕时,大概是android正在拆除活动, 重新实例化它旋转,但我的同伴变量(otv和osb)在onCreate中更新! 这是否意味着旧的值失go 了引用计数并获得了GCed?
我承认我真的不知道我在做什么,我只是不停地try ,直到它奏效. 这个代码有多难闻?这款应用很时髦,效果也很好!