2016-07-20 1 views
3

私は最近私のプロジェクトでleakcanaryを使用することに決めました。したがって、私はアプリケーションを実行すると(論理コードやビューを持たないプロジェクトを作成した直後に)私は空のActivityというプロジェクトを作成しました。このライブラリからメモリリークログを得た:空のメモリリークアクティビティ

07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * com.example.leaktest.MainActivity has leaked: 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * GC ROOT static android.app.ActivityThread.sCurrentActivityThread 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references android.app.ActivityThread.mActivities 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references android.util.ArrayMap.mArray 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references array java.lang.Object[].[1] 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references android.app.ActivityThread$ActivityClientRecord.activity 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * leaks com.example.leaktest.MainActivity instance 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Retaining: 1.7KB. 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Reference Key: 9180226a-8a65-4c94-9d12-4562a6d88157 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Device: Genymotion generic genymotion_vbox86tp_5.1_150409_105318 vbox86tp 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Android Version: 5.1 API: 22 LeakCanary: 1.4-beta2 3799172 
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Durations: watch=5808ms, gc=158ms, heap dump=1953ms, analysis=15795ms 

のAppクラス:

public class App extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     refWatcher = LeakCanary.install(this); 
    } 

    public static RefWatcher getRefWatcher(Context context) { 
     App application = (App) context.getApplicationContext(); 
     return application.refWatcher; 
    } 

    private RefWatcher refWatcher; 
} 

MainActivityクラス:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     App.getRefWatcher(this).watch(this); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

なぜこのようなことが起こっているのかわかりませんが、誰かが私に説明してくれれば感謝します。

+0

ここで何が起こっているのかを言うのは難しいです...あなたがセットアップ漏れカナリーを正しく設定していることについてコードを追加していないことは確かですか? – sockeqwe

+0

こんにちは@sockeqwe、私はコードはありません、レイアウトファイルで表示されていないだけの空白の活動を述べた。 –

+0

断片などはありませんか?ドキュメントに記述されているように 'Application.onCreate()'にleakcanaryを設定していますか、あるいはMainActivityで何かしていますか? – sockeqwe

答えて

2

お客様のRefWatcherは、メソッドでなければなりません。ではなく、reported issue hereです。

LeakCanaryはActivityの参照を自動的に監視するので、これを行う必要はありません。 FAQ

LeakCanary.install()は、事前設定済みのRefWatcherを返します。また、Activity.onDestroy()が呼び出された後にアクティビティがリークしているかどうかを自動的に検出するActivityRefWatcherもインストールされます。

+0

漏れがないことを通知するログを受け取りますか? –

+0

わからない、正直なところ。 – kcoppock

+0

更新された回答を参照してください。 – kcoppock