Google Repo Link。所有的样板代码都是从那里获取的。
我无法弄清楚如何将自己的依赖项添加到此体系结构中。 我想做以下事情:
我一般都懂匕首,但是dagger-android在很多方面让我困惑。
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();
}
ExampleModule:
@Module
public abstract class TasksModule {
@FragmentScoped
@ContributesAndroidInjector
abstract TasksFragment tasksFragment();
@ActivityScoped
@Binds abstract TasksContract.Presenter taskPresenter(TasksPresenter presenter);
}
为ExampleActivity:
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();
}
}
我的所有代码都正常工作,没有匕首,所以你不必担心它。 :)
我希望有人可以帮助我。如果您有其他问题,请随时提出!
答案 0 :(得分:0)
我通过对AsyncTask使用构造函数注入来修复它,并且只在构造函数中传递Okhttp客户端。我不再在AsyncTask中注入演示者,而是使用this将AsyncTask中的值返回给演示者。