简体   繁体   English

使用Dagger2进行依赖注入,如何获取上下文

[英]Dependency Injection with Dagger2, how to get context

I'm learning dependency injection with Dagger2. 我正在学习Dagger2的依赖注入。

I created a HttpRequester class that has a get method and returns some data from a server. 我创建了一个具有get方法的HttpRequester类,并从服务器返回了一些数据。

This is my code: 这是我的代码:

MainActivity 主要活动

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 HttpRequesterModule

@Module
public class HttpRequesterModule {

    @Provides @Singleton
    HttpRequester provideHttpRequester(Context context){

        return new HttpRequester(context);
    }
}

HttpRequesterComponent HttpRequesterComponent

@Singleton
@Component(modules = {HttpRequesterModule.class})
public interface HttpRequesterComponent {

    HttpRequester provideHttpRequester();
}

HttpRequester 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);
    }
}

The problem is that when I call httpRequester.get() I get a NullPointerException since the context is null. 问题是,当我调用httpRequester.get()时,由于上下文为null,所以会收到NullPointerException。 I want to know how to inject the context. 我想知道如何注入上下文。 Thanks for your help! 谢谢你的帮助!

You have to notice that you never initialize the context attribute con HttpRequester. 您必须注意,您永远不会初始化上下文属性con HttpRequester。 Receive a Context in your constructor so it has a value: 在构造函数中接收Context ,因此它具有一个值:

public class HttpRequester {

    Context context;

    public HttpRequester(Context context) {
        this.context = context
    }

    ...
}

After that, you just have to provide it in your HttpRequesterModule : 之后,您只需要在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;
    }
}

Now you just have to pass a Context to your module 现在,您只需将Context传递给模块

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM