如何扩展Google Android体系结构匕首样本



Google Repo链接。所有样板代码均从那里获取。

我只是不知道如何在此体系结构中添加自己的依赖项。我想做以下操作:

  1. 我需要在非碎片类中使用其中一位主持人。
  2. 我需要添加一个网络模块,该模块提供了一个简单的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;
    }
...

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

  1. 我有一个AsyncTask,它需要一个主持人在其onPostExecute方法中发布某些内容。我注入了演示者,但我发现演示者未初始化的错误。

  2. 我将以下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客户端进行了修复。我不再将演示者注入异步性,而是用它来将其从异步返回到主持人。

最新更新