gpt4 book ai didi

java - 如何用 Dagger 注入(inject)匿名内部类?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:02 25 4
gpt4 key购买 nike

可以注入(inject)一个匿名类吗?我遇到以下错误:

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

最佳答案

您应该将 AsyncTask 注入(inject) 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();
}
}

你的 AsyncTask API 应该是;

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

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

关于java - 如何用 Dagger 注入(inject)匿名内部类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21283958/

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