2017-06-27 90 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,協同例程,裝載機等

相關問題