Google Repo链接。所有样板代码均从那里获取。
我只是不知道如何在此体系结构中添加自己的依赖项。我想做以下操作:
- 我需要在非碎片类中使用其中一位主持人。
- 我需要添加一个网络模块,该模块提供了一个简单的OKHTTP客户端。
我一般都了解dagger,但是dagger在许多地方都使我感到困惑。
todoApplication:
public class ToDoApplication extends DaggerApplication {
@Inject
TasksRepository tasksRepository;
@Inject
AsyncTask asyncTask;
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().application(this).build();
}
}
AppComponent:
@Singleton
@Component(modules = {TasksRepositoryModule.class,
ApplicationModule.class,
ActivityBindingModule.class,
AndroidSupportInjectionModule.class})
public interface AppComponent extends AndroidInjector<ToDoApplication> {
TasksRepository getTasksRepository();
AsyncTask getAsyncTask();
@Component.Builder
interface Builder {
@BindsInstance
AppComponent.Builder application(Application application);
AppComponent build();
}
}
applicationModule:
@Module
public abstract class ApplicationModule {
//expose Application as an injectable context
@Binds
abstract Context bindContext(Application application);
}
ActivityBindingModule:
@Module
public abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector(modules = TasksModule.class)
abstract TasksActivity tasksActivity();
@ActivityScoped
@ContributesAndroidInjector(modules = AddEditTaskModule.class)
abstract AddEditTaskActivity addEditTaskActivity();
@ActivityScoped
@ContributesAndroidInjector(modules = StatisticsModule.class)
abstract StatisticsActivity statisticsActivity();
@ActivityScoped
@ContributesAndroidInjector(modules = TaskDetailPresenterModule.class)
abstract TaskDetailActivity taskDetailActivity();
}
exipplemodule:
@Module
public abstract class TasksModule {
@FragmentScoped
@ContributesAndroidInjector
abstract TasksFragment tasksFragment();
@ActivityScoped
@Binds abstract TasksContract.Presenter taskPresenter(TasksPresenter presenter);
}
expepeActivity:
public class TasksActivity extends DaggerAppCompatActivity {
@Inject
TasksPresenter mTasksPresenter;
@Inject
Lazy<TasksFragment> taskFragmentProvider;
...
示例片段:
@ActivityScoped
public class TasksFragment extends DaggerFragment implements TasksContract.View {
@Inject
TasksContract.Presenter mPresenter;
...
示例主持人:
@ActivityScoped
final class TasksPresenter implements TasksContract.Presenter {
@Inject
TasksPresenter(TasksRepository tasksRepository) {
mTasksRepository = tasksRepository;
}
...
上面的代码都正确工作。现在我的问题:
我有一个
AsyncTask
,它需要一个主持人在其onPostExecute
方法中发布某些内容。我注入了演示者,但我发现演示者未初始化的错误。我将以下
NetworkModule
添加到@Component
中的模块数组中,然后将其注入AsyncTask
,但它不起作用(错误:...未初始化(。我还要添加什么?
NetworkModule:
@Module
class NetworkModule {
@Provides
@Singleton
fun provideOkHttp(): OkHttpClient {
return OkHttpClient()
}
}
asynctask
private class MyAsyncTask extends AsyncTask<String, Integer, Long> {
@Inject
TasksPresenter presenter;
@Inject
OkHttpClient client;
protected Long doInBackground(String... params) {
client.doSomething();
...
}
protected void onPostExecute(Long result) {
...
presenter.doSomething();
}
}
我的所有代码都在没有dagger的情况下正常工作,因此您不必担心它。:(
我希望有人可以帮助我。如果您有其他问题,请随时提出!
我通过使用构造函数注入asynctask修复了它,并仅通过构造函数中的OKHTTP客户端进行了修复。我不再将演示者注入异步性,而是用它来将其从异步返回到主持人。