Android 带碎片的匕首PageRadapter-安卓

Android 带碎片的匕首PageRadapter-安卓,android,android-viewpager,dagger-2,Android,Android Viewpager,Dagger 2,我在我的ViewPager中使用了from Dagger,就像下面所说的那样 MyViewPagerAdapter.java: public class ViewPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragmentList; // note: this can cause crashes private final List<S

我在我的
ViewPager中使用了from Dagger
,就像下面所说的那样

My
ViewPagerAdapter.java

    public class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList; // note: this can cause crashes
        private final List<String> mFragmentTitleList;
        private final FragmentManager fragmentManager;
    
        @Inject
        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
            this.fragmentManager = manager;
            this.mFragmentList = new ArrayList<>();
            this.mFragmentTitleList = new ArrayList<>();
        }
    
        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }
    
        @Override
        public int getCount() {
            return mFragmentList.size();
        }
    
        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }
    
        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            super.destroyItem(container, position, object);
            // remove destroyed Fragment from FragmentManager
            if (!mFragmentList.contains(object)) {
                fragmentManager.beginTransaction().remove((Fragment) object).commit();
            }
        }
    
        @Override
        public int getItemPosition(@NonNull Object object) {
            return POSITION_NONE;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
而我的
匕首
就像吼叫一样。我的
ActivityBuilder

@Module
public abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = MainActivityModule.class)
    abstract MainActivity bindMainActivity();

}
AppComponent

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        AppModule.class,
        ActivityBuilder.class})
public interface AppComponent extends AndroidInjector<DaggerApplication> {

    void inject(App app);

    @Override
    void inject(DaggerApplication instance);

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }
}
和我的
main活动模块

@Module
public abstract class AppModule {

    @Binds
    abstract Context provideContext(Application application);

}
@Module
public abstract class MainActivityModule {

    private static MainActivity mainActivity;

    public MainActivityModule(MainActivity mainActivity) {
        this.mainActivity = mainActivity;
    }

    @Provides
    static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
        return new MainPresenter(mainView, dataSourcesLocal);
    }

    @Provides
    static ViewPagerAdapter provideViewPagerAdapter() {
        return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
    }

    @Binds
    abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
我的应用程序类:

public class App extends DaggerApplication {
    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        AppComponent appComponent = DaggerAppComponent
                .builder()
                .application(this)
                .build();
        appComponent.inject(this);
        return appComponent;
    }
}
解决了我的问题:

@Module
public abstract class MainActivityModule {

    @Provides
    static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
        return new MainPresenter(mainView, dataSourcesLocal);
    }

    @Provides
    static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
        return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
    }

    @Binds
    abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}

main模块更改为:

@Module
public abstract class MainActivityModule {

    @Provides
    static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
        return new MainPresenter(mainView, dataSourcesLocal);
    }

    @Provides
    static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
        return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
    }

    @Binds
    abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}

你不必自己实例化你的模块:Dagger将为你处理它,并提供你的
MainActivity

你好,你有一个
静态MainActivity
,这意味着你很可能会泄漏内存使用过
ViewPagerAdapter.addFragment(fragmentInstance)
,它将不可避免地导致整个进程死机。
@Module
public abstract class MainActivityModule {

    @Provides
    static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
        return new MainPresenter(mainView, dataSourcesLocal);
    }

    @Provides
    static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
        return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
    }

    @Binds
    abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
@Module
public abstract class MainActivityModule {

    @Provides
    static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
        return new MainPresenter(mainView, dataSourcesLocal);
    }

    @Provides
    static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
        return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
    }

    @Binds
    abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}