gadfi
@gadfi
https://gamega.org

Dagger 2 inject в ContentProvider?

Здравствуйте.
Использую dagger 2, хочу проинжектить SqliteOpenHelper в ContentProvider
@Module
public class ApplicationModule {
    private Application mApp;
    public ApplicationModule(Application app) {
        mApp = app;
    }

    @Provides
    @Singleton
    Context provideContext() {
        return mApp.getApplicationContext();
    }

    @Provides
    @Singleton
    DatabaseHelper provideDatabaseHelper() {
        return new DatabaseHelper(mApp.getApplicationContext());
    }

}


public class App extends Application {
public static App app;
    private  AppComponent mAppComponent;
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("Application", "onCreate ");
        app = this;
        initComponent();

    }


    public static App getInstance(){
        return app;
    }
    ApplicationModule getApplicationModule() {
        return new ApplicationModule(this);
    }

    public  AppComponent getAppComponent(){
        return mAppComponent;
    }

    void initComponent() {
        mAppComponent =  DaggerAppComponent.builder()
                .applicationModule(getApplicationModule())
                .build();
    }
    

}


@Component(modules = {ApplicationModule.class})
@Singleton
public interface AppComponent {
    void inject(FriendsActivity activity);
    void inject(Provider provider);
}


если с для Activity все просто

@Inject
    public DatabaseHelper mDatabaseHelper;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_friends_m);
        ((App) getApplication()).getAppComponent().inject(this);
........


то когда в ContentProvider ловлю npe, ранее с dagger не работал и есть подозрения что где то сильно туплю

public class Provider extends ContentProvider {
    @Inject
    DatabaseHelper databaseHelper;
  @Override
    public boolean onCreate() {

        App.getInstance().getAppComponent().inject(this);
        return false;
    }
.......


заранее спасибо
  • Вопрос задан
  • 1777 просмотров
Решения вопроса 1
LeEnot
@LeEnot
Енот-андроид
onCreate()провайдера вызывается раньше, чем соответствующий метод у Application. Полагаю, можно попробовать вынести создание компонента в другой метод Application, например, конструктор или attachBaseContext
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы