Java Leakcanary使用Otto报告内存泄漏

Java Leakcanary使用Otto报告内存泄漏,java,android,android-fragments,memory-leaks,otto,Java,Android,Android Fragments,Memory Leaks,Otto,接下来,这是我无法消除的第二个内存泄漏 我读到我需要根据活动和片段生命周期注册和注销静态Otto总线,所以我添加了对onStop和onStart的注册和注销调用。。。有一个按钮触发一个事件,然后由Viewpager中的一些片段接收,这会导致以下内存泄漏: D/LeakCanary﹕ In com.doesnthaveadomain.leo.calendartracker:1.0:1. D/LeakCanary﹕ * com.doesnthaveadomain.leo.calendartracke

接下来,这是我无法消除的第二个内存泄漏

我读到我需要根据活动和片段生命周期注册和注销静态Otto总线,所以我添加了对onStop和onStart的注册和注销调用。。。有一个按钮触发一个事件,然后由Viewpager中的一些片段接收,这会导致以下内存泄漏:

D/LeakCanary﹕ In com.doesnthaveadomain.leo.calendartracker:1.0:1.
D/LeakCanary﹕ * com.doesnthaveadomain.leo.calendartracker.MyFragment has leaked:
D/LeakCanary﹕ * GC ROOT static com.doesnthaveadomain.leo.calendartracker.MyBus.BUS
D/LeakCanary﹕ * references com.squareup.otto.Bus.handlersByType
D/LeakCanary﹕ * references java.util.concurrent.ConcurrentHashMap.table
D/LeakCanary﹕ * references array java.util.concurrent.ConcurrentHashMap$Node[].[3]
D/LeakCanary﹕ * references java.util.concurrent.ConcurrentHashMap$Node.val
D/LeakCanary﹕ * references java.util.concurrent.CopyOnWriteArraySet.al
D/LeakCanary﹕ * references java.util.concurrent.CopyOnWriteArrayList.elements
D/LeakCanary﹕ * references array java.lang.Object[].[0]
D/LeakCanary﹕ * references com.squareup.otto.EventHandler.target
D/LeakCanary﹕ * leaks com.doesnthaveadomain.leo.calendartracker.MyFragment instance
我的代码

主要活动

导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.app.FragmentStatePagerAdapter;
导入android.support.v4.view.ViewPager;
导入android.support.v7.app.AppActivity;
导入android.view.view;
导入android.widget.Button;
导入java.lang.ref.WeakReference;
公共类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager mViewPager=(ViewPager)findViewById(R.id.ViewPager);
MyAdapter MyAdapter=新的MyAdapter(getSupportFragmentManager(),this);
mViewPager.setAdapter(myAdapter);
mViewPager.setCurrentItem(5);
Button Button=(Button)findViewById(R.id.do\u something);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
MyBus.getInstance().post(newsomeevent(“Something”);
}
});
}
静态类SomeEvent{
字符串mString;
SomeEvent(字符串){
mString=string;
}
公共字符串getString(){
返回mString;
}
}
}
类MyAdapter扩展了FragmentStatePagerAdapter{
私人意见;
私人最终WeakReference mActivityWeakRef;
公共MyAdapter(FragmentManager fm,
应用程序(活动){
超级(fm);
mActivityWeakRef=新的WeakReference(活动);
mNumberOfViews=10;
}
@凌驾
公共片段getItem(int位置){
MyFragment MyFragment=新的MyFragment();
AppCompativeActivity=mActivityWeakRef.get();
if(活动!=null){
MyApp.getRefWatcher(mActivityWeakRef.get()).watch(myFragment);
}
返回myFragment;
}
@凌驾
public int getCount(){
返回多个视图;
}
}
我的碎片

布局,以防万一。。主要活动:


片段:


您在错误的时间查看引用。只有当您完全确定
东西
将被垃圾收集时,才应该调用
监视(东西)
。对于您的活动和片段,您需要以下内容:

@Override public void onDestroy() {
    super.onDestroy();
    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
    refWatcher.watch(this);
}

这是LeakCanary常见问题解答

非常感谢,这似乎解决了问题!如果我没有花足够的时间仔细阅读,我当然应该慢慢地学习图书馆。我认为裁判观察者的工作方式和活动一样。新链接
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.design.widget.AppBarLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar_appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true" >

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:theme="@style/AppTheme.Toolbar"
            app:popupTheme="@style/AppTheme.Toolbar.Popup">

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>

    <Button
        android:id="@+id/do_something"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="DO"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_vertical_margin"
    android:paddingStart="@dimen/activity_vertical_margin"
    android:paddingRight="@dimen/activity_vertical_margin"
    android:paddingEnd="@dimen/activity_vertical_margin"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

</LinearLayout>
@Override public void onDestroy() {
    super.onDestroy();
    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
    refWatcher.watch(this);
}