2016-02-26 83 views
0

我學習依賴注入Dagger2。依賴注入與Dagger2,如何獲取上下文

我創建一個具有get方法,並從服務器返回一些數據的HttpRequester類。

這是我的代碼:

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

@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異常,因爲上下文爲null。我想知道如何注入上下文。謝謝你的幫助!

回答

0

你必須注意到,你永遠不會初始化上下文屬性精讀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; 
    } 
} 

現在,你只需要一個上下文傳遞給你的模塊

+0

我增加了構造器到HttpRequester類和改性的HttpRequesterModule。我編輯了原來的問題。現在,我得到「錯誤:(17,19)錯誤:沒有@不能提供android.content.Context提供標註方法 daggertutorial.modules.HttpRequesterModule.provideHttpRequester(android.content.Context上下文) [參數。 :android.content.Context上下文]「。我在HttpRequesterModule類中丟失了什麼? – Ricardo

+0

是的,你是。 Dagger 2沒有辦法爲你的'HttpRequester'提供'Context'對象。我會更新我的答案 – Pelocho