2017-06-27 25 views
7

在这里处理java android的This class should be static or leaks might occur有很多问题。在Kotlin Android中,“这个AsyncTask类应该是静态还是可能发生泄漏”的正确方法是什么?

This Handler class should be static or leaks might occur: IncomingHandler

This Handler class should be static or leaks might occur:AsyncQueryHandler

This AsyncTask class should be static or leaks might occur (anonymous android.os.AsyncTask)

该警告是由于内部类持有外部类的隐式引用,并且因此防止GC'd外部类的事实。 解决方案在于警告本身,该类应声明为静态。

但是,解决方案是java特定的。鉴于kotlin没有static修饰符,最接近的是companion object并且伴侣对象确实引用了它的“外部类”。

下面是我的[失败]与言论试图

class MyActivity : AppCompatActivity(), MyListener { 

    companion object { 
     class Attempt3Task(val callback: MyListener) : AsyncTask<Unit, Unit, Unit>() { 
      override fun doInBackground(vararg params: Unit?) { 
       TODO("") 
      } 

      override fun onPostExecute(result: Unit?) { 
       callback.updateUi() 
      } 
     } 
    } 

    inner class Attempt2Task : AsyncTask<Unit, Unit, Unit>() { 
     override fun doInBackground(vararg params: Unit?) { 
      TODO(" 
     } 
    } 

    // Gives warning "This AsyncTask class should be static or leaks might occur" 
    val attempt_1 = object: AsyncTask<Unit, Unit, Unit>() { 
     override fun doInBackground(vararg params: Unit?) { 
      TODO("") 
     } 
    } 

    // Does not give warning but, as far as I can tell, is conceptually same as attempt_1 
    val attempt_2 = Attempt2Task() 

    // Does not give warning but companion object does have reference to the activity, no? 
    val attempt_3 = Attempt3Task(this) 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
    } 
} 

约ATTEMPT2和attempt3正确,即使没有棉短绒警告,该代码仍然漏水的说法对吗?

我们有什么选择可以避免泄漏? 我是否应该解决普通旧的顶级class MyTask : AsyncTask<Unit, Unit, Unit>()WeakReference成员回调?

+0

我想说'的AsyncTask '应尽可能在当地。所以上面的所有代码都是错误的用法。这意味着在使用后立即处置/释放它。 –

+0

默认情况下,Kotlin中的嵌套类相当于Java中的'static class' - 您是否尝试删除'Attempt2Task'的'inner'关键字?见https://kotlinlang.org/docs/reference/nested-classes.html –

+0

@JK谢谢指出!我已经多次阅读了“内部类”节,却没有意识到它暗示了嵌套类没有访问外部类的成员! – user2829759

回答

1

为什么在活动类之外没有AsyncTask类声明?

在Kotlin中,它可能与活动位于同一个文件中,但位于Activity类的上方/下方。

这样就没有隐藏参考的问题。

此外,请确保只保留AsyncTask中的侦听器的WeakReference。

这就是说,根据我的AsyncTask属于过去,你现在应该使用一些更现代的替代品,如RxJava,协同例程,装载机等

相关问题