Tag: 内存泄漏

AsyncTask没有泄漏

这个AsyncTask类应该是静态的,否则可能发生泄漏 为什么我的AsyncTask不起作用? 调用: PlacesTask(this).execute(…) 码: private class PlacesTask internal constructor(activity: MainActivity) : AsyncTask<String, Int, String>() { var data: String? = null private val mRef: WeakReference<MainActivity> = WeakReference(activity) override fun doInBackground(vararg url: String): String? { try { data = MainActivity().downloadUrl(url[0]) } catch (e: Exception) { Log.d("Background Task", e.toString()) } return data } override fun onPostExecute(result: String) […]

在Kotlin Android中,“AsyncTask类应该是静态还是可能发生泄漏”的正确方法是什么?

这里处理的问题有很多, This class should be static or leaks might occur java android中This class should be static or leaks might occur 。 这个Handler类应该是静态的或者可能发生泄漏:IncomingHandler 这个Handler类应该是静态的或者可能发生泄漏:AsyncQueryHandler 这个AsyncTask类应该是静态的或者可能发生泄漏(anonymous android.os.AsyncTask) 这个警告是由于内部类持有对外部类的隐式引用,因此阻止了GC'd中的外部类。 解决方案在于警告本身应该声明类是静态的。 但是,解决方案是特定于java的。 鉴于kotlin没有static修饰符,最接近的是伴侣对象 ,伴侣对象持有对其“外部类”的引用。 下面是我的[失败]的言论尝试 class MyActivity : AppCompatActivity(), MyListener { companion object { class Attempt3Task(val callback: MyListener) : AsyncTask<Unit, Unit, Unit>() { override fun doInBackground(vararg params: Unit?) { […]

将传递lambda到Observable.subscribe in kotlin导致内存泄漏?

请参阅以下kotlin代码: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { val disposable = Observable.interval(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) .subscribe { textView.text = it.toString } } } 在这里,我正在传递一个lambda表达式,而不是一个匿名的内部类。 那么是否需要调用disposable.dispose()以防止内存泄漏? 或者,lambda表达式不会保留对MainActivity类的实例的隐式引用。 如果我确实需要处理它,那么最好的方法是什么?为什么?

在Kotlin的对象字段中带有上下文的Android类

在Kotlin的对象类中有一个属性,它有一个上下文吗? 在Android中,将上下文相关的对象放在静态字段中是一种不好的做法。 Android工作室甚至突出显示它,并给出了一个警告,不像Kotlin没有警告。 示例对象: object Example { lateinit var context: Context fun doStuff(){ //..work with context } }

Kotlin:安全的lambdas(没有内存泄漏)?

在阅读了关于内存泄漏的这篇文章之后,我想知道在Kotlin Android项目中使用lambdas是否安全。 确实,lambda语法使得我的程序更加轻松,但是内存泄漏呢? 作为一个有问题的例子,我从我的一个项目中取得了一段代码,在那里构建了一个AlertDialog。 这段代码在我的项目的MainActivity类中。 fun deleteItemOnConfirmation(id: Long) : Unit { val item = explorerAdapter.getItemAt(id.toInt()) val stringId = if (item.isDirectory) R.string.about_to_delete_folder else R.string.about_to_delete_file val dialog = AlertDialog.Builder(this). setMessage(String.format(getString(stringId), item.name)).setPositiveButton( R.string.ok, {dialog: DialogInterface, id: Int -> val success = if (item.isDirectory) ExplorerFileManager.deleteFolderRecursively(item.name) else ExplorerFileManager.deleteFile(item.name) if (success) { explorerAdapter.deleteItem(item) explorerRecyclerView.invalidate() } else Toast.makeText(this@MainActivity, R.string.file_deletion_error, Toast.LENGTH_SHORT).show() }).setNegativeButton( R.string.cancel, […]