有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用dagger注入匿名内部类?

有可能是匿名类吗?我有以下错误:

java.lang.IllegalArgumentException: No inject registered for members/com.acme.MyFragment$1. You must explicitly add it to the 'injects' option in one of your modules.

例如:

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!";
    }
}

共 (2) 个答案

  1. # 1 楼答案

    您应该将AsyncTask注入MyFragment,而不是使用“new 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;
      }
    

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

    public class MyFragment extends Fragment {
        @Inject Provider<MyTask> myTaskProvider;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            inject(this);
            myTaskProvider.get().execute();
        }
    }
    

    你的AsyncTaskAPI应该是

    @Inject 
    public MyTask(Context context, UserApi userApi) { }
    

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

  2. # 2 楼答案

    你不能注入匿名类。但是你可以把它注入到片段中,它对于匿名类是可见的,在本例中是AsyncTask

    public class MyFragment extends Fragment {
    
     @Inject
     UserApi userApi;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        App.getInstance().inject(this);
    
        new MyTrask() {
            protected void onPostExecute(String result) {
                // Stuff
            }
        }.execute();
      }
    }
    
     public class MyTask extends AsyncTask<Void, Void, String> {
    
     @Override
     protected String doInBackground(Void... params) {
        userApi.callAnyMethod(); // use userApi here
        return "Hello World!";
     }
    }