2017-06-27 5 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正しいについての主張はありますか?

漏れを防ぐためにどのようなオプションが必要ですか? コールバックにWeakReferenceのメンバーを持つ普通の古いトップレベルclass MyTask : AsyncTask<Unit, Unit, Unit>()に解決する必要がありますか?

+0

を使用する必要があります私は 'AsyncTaskを言いたいです'できるだけローカルにする必要があります。上のすべてのコードは間違った使い方です。それは、使用直後に処分/放出することを意味する。 –

+0

Kotlinのネストされたクラスは、デフォルトでJavaの 'static class'に相当します。' Attempt2Task'の 'inner'キーワードを削除しようとしましたか? https://kotlinlang.org/docs/reference/nested-classes.html –

+0

@JKを参照してくださいありがとう!私は '内部クラス'セクションを何度も読んだことがありますが、入れ子クラスは外部クラスのメンバにアクセスできません。 – user2829759

答えて

1

アクティビティクラスの外部でAsyncTaskクラス宣言を使用しないのはなぜですか?

アクティビティと同じファイルにある可能性がありますが、アクティビティクラスの上下にある可能性があります。

このようにして、隠れた参照についての問題はありません。

また、AsyncTask内のリスナーに対してWeakReferenceを保持するようにしてください。言っ

は、私によると、AsyncTaskは過去に属し、あなたが今などRxJava、コルーチン、ローダー、などいくつかのより近代的な選択肢

関連する問題