如何使用匕首注入匿名内部类?

Bra*_*bin 3 java anonymous-inner-class dagger

它是否可以注入一个匿名类?我有以下错误:

java.lang.IllegalArgumentException:没有为members/com.acme.MyFragment $ 1注册注入.您必须将其显式添加到其中一个模块的"注入"选项中.

例:

public class MyFragment extends Fragment {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new MyTrask(getActivity()) {
            protected void onPostExecute(String result) {
                // Stuff
            }
        }.execute();
    }
}

public class MyTask extends AsyncTask<Void, Void, String> {

    @Inject
    UserApi userApi;

    public MyTask(Context context) {
        App.getInstance().inject(this);
    }

    @Override
    protected String doInBackground(Void... params) {
        return "Hello World!";
    }
}
Run Code Online (Sandbox Code Playgroud)

Oce*_*ife 8

你应该注入AsyncTaskMyFragment而不是使用"新MyTask(..)".的MyTask构造应采取UserApi实例和Context其可通过用码类似于该模块来提供对象;

  /**
   * The application module.
   *
   * @param context The context.
   */
  public MyModule(final Context context) {
    this.context = context.getApplicationContext();
  }

  /**
   * Provides context.
   *
   * @return the application context.
   */
  @Provides @Singleton Context provideContext() {
    return context;
  }
Run Code Online (Sandbox Code Playgroud)

你的片段代码应该是这样的;

public class MyFragment extends Fragment {
    @Inject Provider<MyTask> myTaskProvider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        inject(this);
        myTaskProvider.get().execute();
    }
}
Run Code Online (Sandbox Code Playgroud)

你的AsyncTask API应该是;

@Inject 
public MyTask(Context context, UserApi userApi) { }
Run Code Online (Sandbox Code Playgroud)

注意我使用了a Provider来注入AsyncTask.这对于避免类似于"您只能执行一次任务"的异常是必要的,如果您多次调用execute同一个AsyncTask对象,则会遇到这种异常.然后MyFragment在模块injects = { }注释参数下注册.

  • 这会奏效.您也可以将`UserApi`注入片段并将其传递给`MyTask`的构造函数. (3认同)