gpt4 book ai didi

java - 如何扩展 Google android 架构 Dagger 示例?

转载 作者:行者123 更新时间:2023-11-29 02:32:39 24 4
gpt4 key购买 nike

Google Repo Link .所有样板代码都取自那里。

我只是不知道如何将我自己的依赖项添加到这个架构中。我想做以下事情:

  1. 我需要在非 fragment 类中使用其中一位演示者。
  2. 我需要添加一个网络模块,它提供了一个简单的 OkHttp 客户端。

我总体上理解 dagger,但是 dagger-android 在很多地方让我感到困惑。

ToDo应用程序:

public class ToDoApplication extends DaggerApplication {
@Inject
TasksRepository tasksRepository;

@Inject
AsyncTask asyncTask;

@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().application(this).build();
}
}

应用组件:

@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();
}
}

应用模块:

@Module
public abstract class ApplicationModule {
//expose Application as an injectable context
@Binds
abstract Context bindContext(Application application);
}

Activity 绑定(bind)模块:

@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();
}

示例模块:

@Module
public abstract class TasksModule {
@FragmentScoped
@ContributesAndroidInjector
abstract TasksFragment tasksFragment();

@ActivityScoped
@Binds abstract TasksContract.Presenter taskPresenter(TasksPresenter presenter);
}

示例 Activity :

public class TasksActivity extends DaggerAppCompatActivity {
@Inject
TasksPresenter mTasksPresenter;
@Inject
Lazy<TasksFragment> taskFragmentProvider;

...

示例 fragment :

@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;
}

...

上面的代码都可以正常工作。现在我的问题:

  1. 我有一个 AsyncTask,它需要演示者在它的 onPostExecute 方法中发布一些内容。我注入(inject)了演示器,但出现演示器未初始化的错误。

  2. 我将以下NetworkModule 添加到@Component 中的模块数组,并简单地将它注入(inject)到AsyncTask 中,但它不是工作(错误:...未初始化)。我还需要补充什么吗?

网络模块:

@Module
class NetworkModule {

@Provides
@Singleton
fun provideOkHttp(): OkHttpClient {
return OkHttpClient()
}
}

异步任务

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 使用构造函数注入(inject)并仅在构造函数中传递 Okhttp 客户端来修复它。我不再在 AsyncTask 中注入(inject)演示者,而是使用 this将值从 AsyncTask 返回给演示者。

关于java - 如何扩展 Google android 架构 Dagger 示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48774255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com