使用 Dagger2 进行依赖注入,如何获取上下文
Dependency Injection with Dagger2, how to get context
我正在学习使用 Dagger2 进行依赖注入。
我创建了一个 HttpRequester class,它有一个 get 方法和 returns 来自服务器的一些数据。
这是我的代码:
主要活动
public class MainActivity extends AppCompatActivity {
@Inject
HttpRequester httpRequester;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getHttpRequester();
httpRequester.get("http://url.to.get.the.data", new HttpRequester.Listener() {
@Override
public void onDataRetrieved(String result) {
Log.d("App", "Result: " + result);
}
});
}
@Override
protected void onStop () {
super.onStop();
if (httpRequester != null) {
httpRequester.cancelAll();
}
}
void getHttpRequester() {
HttpRequesterComponent httpRequesterComponent = DaggerHttpRequesterComponent.builder().httpRequesterModule(new HttpRequesterModule()).build();
httpRequester = httpRequesterComponent.provideHttpRequester();
}
}
HttpRequesterModule
@Module
public class HttpRequesterModule {
@Provides @Singleton
HttpRequester provideHttpRequester(Context context){
return new HttpRequester(context);
}
}
HttpRequesterComponent
@Singleton
@Component(modules = {HttpRequesterModule.class})
public interface HttpRequesterComponent {
HttpRequester provideHttpRequester();
}
HttpRequester
public class HttpRequester {
Context context;
public HttpRequester(Context context) {
this.context = context;
}
public interface Listener {
void onDataRetrieved(String result);
}
private RequestQueue queue = Volley.newRequestQueue(context);
public static final String TAG = "TAG";
public void get(String url, final Listener listener){
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String res) {
listener.onDataRetrieved(res);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
stringRequest.setTag(TAG);
queue.add(stringRequest);
}
public void cancelAll() {
queue.cancelAll(TAG);
}
}
问题是,当我调用 httpRequester.get() 时,我得到一个 NullPointerException,因为上下文为空。我想知道如何注入上下文。感谢您的帮助!
您必须注意,您从未初始化 con HttpRequester 的上下文属性。在你的构造函数中接收一个 Context
所以它有一个值:
public class HttpRequester {
Context context;
public HttpRequester(Context context) {
this.context = context
}
...
}
之后,您只需在 HttpRequesterModule
:
中提供
@Module
public class HttpRequesterModule {
private final Context context;
public HttpRequesterModule(Context context) {
this.context = context;
}
@Provides @Singleton
HttpRequester provideHttpRequester(Context context){
return new HttpRequester(context);
}
@Provides
Context provideContext() {
return context;
}
}
现在您只需将上下文传递给您的模块
我正在学习使用 Dagger2 进行依赖注入。
我创建了一个 HttpRequester class,它有一个 get 方法和 returns 来自服务器的一些数据。
这是我的代码:
主要活动
public class MainActivity extends AppCompatActivity {
@Inject
HttpRequester httpRequester;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getHttpRequester();
httpRequester.get("http://url.to.get.the.data", new HttpRequester.Listener() {
@Override
public void onDataRetrieved(String result) {
Log.d("App", "Result: " + result);
}
});
}
@Override
protected void onStop () {
super.onStop();
if (httpRequester != null) {
httpRequester.cancelAll();
}
}
void getHttpRequester() {
HttpRequesterComponent httpRequesterComponent = DaggerHttpRequesterComponent.builder().httpRequesterModule(new HttpRequesterModule()).build();
httpRequester = httpRequesterComponent.provideHttpRequester();
}
}
HttpRequesterModule
@Module
public class HttpRequesterModule {
@Provides @Singleton
HttpRequester provideHttpRequester(Context context){
return new HttpRequester(context);
}
}
HttpRequesterComponent
@Singleton
@Component(modules = {HttpRequesterModule.class})
public interface HttpRequesterComponent {
HttpRequester provideHttpRequester();
}
HttpRequester
public class HttpRequester {
Context context;
public HttpRequester(Context context) {
this.context = context;
}
public interface Listener {
void onDataRetrieved(String result);
}
private RequestQueue queue = Volley.newRequestQueue(context);
public static final String TAG = "TAG";
public void get(String url, final Listener listener){
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String res) {
listener.onDataRetrieved(res);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
stringRequest.setTag(TAG);
queue.add(stringRequest);
}
public void cancelAll() {
queue.cancelAll(TAG);
}
}
问题是,当我调用 httpRequester.get() 时,我得到一个 NullPointerException,因为上下文为空。我想知道如何注入上下文。感谢您的帮助!
您必须注意,您从未初始化 con HttpRequester 的上下文属性。在你的构造函数中接收一个 Context
所以它有一个值:
public class HttpRequester {
Context context;
public HttpRequester(Context context) {
this.context = context
}
...
}
之后,您只需在 HttpRequesterModule
:
@Module
public class HttpRequesterModule {
private final Context context;
public HttpRequesterModule(Context context) {
this.context = context;
}
@Provides @Singleton
HttpRequester provideHttpRequester(Context context){
return new HttpRequester(context);
}
@Provides
Context provideContext() {
return context;
}
}
现在您只需将上下文传递给您的模块