如何扩展谷歌android架构匕首样本?

时间:2018-02-13 19:28:02

标签: java android dagger-2 dagger

Google Repo Link。所有的样板代码都是从那里获取的。

我无法弄清楚如何将自己的依赖项添加到此体系结构中。 我想做以下事情:

  1. 我需要在非片段类中使用其中一个演示者。
  2. 我需要添加一个网络模块,它提供了一个简单的OkHttp客户端。
  3. 我一般都懂匕首,但是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;
        }
    
    ...
    

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

    1. 我有AsyncTask,需要演示者在其中onPostExecute方法发布内容。我注入了演示者,但是我收到了演示者未初始化的错误。

    2. 我将以下NetworkModule添加到@Component中的模块数组中,只是将其注入AsyncTask,但它无效(错误:.. 。未初始化)。我还需要添加什么?

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

      我的所有代码都正常工作,没有匕首,所以你不必担心它。 :)

      我希望有人可以帮助我。如果您有其他问题,请随时提出!

1 个答案:

答案 0 :(得分:0)

我通过对AsyncTask使用构造函数注入来修复它,并且只在构造函数中传递Okhttp客户端。我不再在AsyncTask中注入演示者,而是使用this将AsyncTask中的值返回给演示者。