私はRoboGuiceを使いましたが、廃止されました。私はDagger2で置き換え始めます。 Dagger2多くのアクティビティ/フラグメント/サービスを注入します(可能なNPEがたくさんあります)
// https://github.com/google/dagger
compile('com.google.dagger:dagger:2.7')
annotationProcessor 'com.google.dagger:dagger-compiler:2.7'
provided 'org.glassfish:javax.annotation:10.0-b28'
public class Application extends MultiDexApplication {
private ApplicationComponent mApplicationComponent;
@Override
public void onCreate() {
super.onCreate();
mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
mApplicationComponent.inject(this);
}
public static Application getApp(@NonNull Context context) {
return (Application) context.getApplicationContext();
}
public static ApplicationComponent getApplicationComponent(@NonNull Context context) {
return getApp(context).getApplicationComponent();
}
}
そして、私は例えばApplicationComponent
を注入したいときにどこでも後
@Module
public class ApplicationModule {
Application mApp;
public ApplicationModule(@NonNull Application app) {
Preconditions.checkNotNull(app);
mApp = app;
}
@Provides
@Singleton
public SharedPreferences providesSharedPrefs() {
return PreferenceManager.getDefaultSharedPreferences(mApp);
}
@Provides
@Singleton
public DateHelper providesDateHelper() {
return new DateHelper(mApp);
}
@Provides
@Singleton
public PersistentConfig providesPersistentConfig() {
return new PersistentConfig(mApp);
}
@Provides
@Singleton
public OttoBus providesOttoBus() {
return new OttoBus();
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
@Inject
PersistentConfig mPersistentConfig;
@Inject
OttoBus mOttoBus;
@Override
public void onCreate(Bundle savedInstanceState) {
Helper.manageRotation(this);
super.onCreate(null);
setContentView(R.layout.main_layout);
Application.getApplicationComponent(this).inject(this);
}
}
Application.getApplicationComponent(context).inject(this);
最初の質問:私はinterface ApplicationComponent
について本当に困惑している私は、注射を使用する場所すべて活動/フラグメント/サービス(など)を提供する必要があります。しかし、Activity/Fragment
のような汎用オブジェクトは使用できません。または、私は実際には現実の外にあり、Dagger2の仕組みを理解できませんか?
これを約50+活動およびフラグメント/サービスのトンを使用したプロジェクトのために本当にクレイジーなので...
@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(@NonNull Application app);
void inject(@NonNull MainActivity object);
void inject(@NonNull DispatcherActivity object);
void inject(@NonNull DateTimeHelper object);
void inject(@NonNull DatabaseHelper object);
void inject(@NonNull LandingPageActivityFragment object);
void inject(@NonNull RedirectActivity object);
void inject(@NonNull CategoryFragment object);
void inject(@NonNull BaseModuleFragment object);
void inject(@NonNull NotificationHelper object);
void inject(@NonNull RecordAdapter object);
void inject(@NonNull PagingProvider object);
void inject(@NonNull FilterDialog object);
... next 100+ injections?
}
は
...それは本当ではないことを、私に言いました2番目の質問: genericクラスを挿入する方法は、特定のオブジェクトが必要なのでvoid inject(@NonNull NotificationHelper<? extends GenericObject> object);
のように使うことができません。だから私はこのオブジェクトをApplicationComponent
の中に書いて、?
表記を使わないでください。
RoboGuiceの方がはるかに開発者に親しみやすく、このオーバーヘッドと手動で注入されたすべてのオブジェクトをチェックする必要はありませんか?このリストに追加するのを忘れたときは(私はそれを、それは顧客をクラッシュする多くのことをテストしないとき)、実行時にNPE
を取得します。
それははるかに速く、それはActivity/Fragment/Service
のような一般的なオブジェクトを使用することはできませんときにすべてのオブジェクトのリストを作成するよりも、手動でそれを書くのです。
より良い解決策がありますか?同じ汎用品を使用したくない場合 ApplicationModule
とすべての活動はこの巨大なBaseActivity
によって拡張されますか?