android - try to get Retrofit with dependency injection -


i trying list of job leads in android application.i use dagger 2 retrofit , okhttp,but error

    java.lang.runtimeexception: unable start activity componentinfo{com.../com...accueilactivity}: java.lang.nullpointerexception: attempt invoke virtual method 'java.lang.object retrofit2.retrofit.create(java.lang.class)' on null object reference                                                                           @ android.app.activitythread.performlaunchactivity(activitythread.java:3319)                                                                           @ android.app.activitythread.handlelaunchactivity(activitythread.java:3415)                                                                           @ android.app.activitythread.access$1100(activitythread.java:229)                                                                           @ android.app.activitythread$h.handlemessage(activitythread.java:1821)                                                                           @ android.os.handler.dispatchmessage(handler.java:102)                                                                           @ android.os.looper.loop(looper.java:148)                                                                           @ android.app.activitythread.main(activitythread.java:7325)                                                                           @ java.lang.reflect.method.invoke(native method)                                                                           @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1230)                                                                           @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1120)                                                                        caused by: java.lang.nullpointerexception: attempt invoke virtual method 'java.lang.object retrofit2.retrofit.create(java.lang.class)' on null object reference 

i create 2 components applicationcomponent, netcomponent

@singleton @component(modules = {netmodule.class,applicationmodule.class}) public interface netcomponent { void inject(appcompatactivity activity); void inject(fragment fragment); } 

and tow modules applicationmodule, netmodule

import android.app.application; import dagger.module; import dagger.provides; import okhttp3.cache; import okhttp3.okhttpclient; import retrofit2.retrofit; import retrofit2.converter.gson.gsonconverterfactory; import com.google.gson.fieldnamingpolicy; import com.google.gson.gson; import com.google.gson.gsonbuilder; import javax.inject.singleton; @module public class netmodule { string baseurl; public netmodule(string baseurl) {     this.baseurl = baseurl; } @provides @singleton cache provideokhttpcache(application application) {     int cachesize = 10 * 1024 * 1024; // 10 mib     cache cache = new cache(application.getcachedir(), cachesize);     return cache; } @provides @singleton gson providegson() {     gsonbuilder gsonbuilder = new gsonbuilder();     gsonbuilder.setfieldnamingpolicy(fieldnamingpolicy.lower_case_with_underscores);     return gsonbuilder.create(); }  @provides @singleton okhttpclient provideokhttpclient(cache cache) {     okhttpclient client = new okhttpclient.builder().cache(cache).build();     return client; } @provides @singleton public retrofit provideretrofit(gson gson, okhttpclient okhttpclient) {     retrofit retrofit = new retrofit.builder()             .addconverterfactory(gsonconverterfactory.create(gson))             .baseurl(baseurl)             .client(okhttpclient)             .build();     return retrofit;    } } 

i try inject retrofit in activity null exception

    public class accueilactivity extends appcompatactivity { arraylist<menuitem> menu = new arraylist<>(); @inject retrofit retrofit; @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_accueil); ((androidapplication) getapplicationcontext()).getnetcomponent().inject(this); call<list<jobleads>> jobleadlist = retrofit.create(getjobleads.class).getjobleads();     jobleadlist.enqueue(new callback<list<jobleads>>() {         @override         public void success(result<list<jobleads>> result) {          }          @override         public void failure(twitterexception exception) {          }     }); } 

and androidapplication class

public class androidapplication extends application {  private applicationcomponent applicationcomponent; private netcomponent netcomponent;  @override public void oncreate() {     super.oncreate();     this.initializeinjector();     sugarcontext.init(this); }   private void initializeinjector() {      this.applicationcomponent = daggerapplicationcomponent.builder()             .applicationmodule(new applicationmodule(this))             .build();     this.netcomponent = daggernetcomponent.builder()             .applicationmodule(new applicationmodule(this))             .netmodule(new netmodule(job_leads_api2))             .build();  }  public applicationcomponent getapplicationcomponent() {     return this.applicationcomponent; }  public netcomponent getnetcomponent() {     return this.netcomponent; }  @override public void onterminate() {     super.onterminate();     sugarcontext.terminate(); } } 

you should inject in accueilactivity not in appcompatactivity

@singleton @component(modules = {netmodule.class,applicationmodule.class}) public interface netcomponent { void inject(accueilactivity activity); void inject(fragment fragment); } 

edit: working example:

create injecthelper it's easier reuse in other classes

public class injecthelper { private static rootcomponent srootcomponent;  static {     initmodules(); }  private static void initmodules() {     srootcomponent = getrootcomponentbuilder().build(); }  public static daggerrootcomponent.builder getrootcomponentbuilder() {     return daggerrootcomponent.builder(); }  public static rootcomponent getrootcomponent() {     if (srootcomponent == null) {         initmodules();     }     return srootcomponent; } } 

the component

@singleton @component(modules = { netmodule.class }) public interface rootcomponent {     void inject(accueilactivity activity);     void inject(fragment fragment); } 

the net module retrofit instance

@module public class netmodule {     private static final int connect_timeout = 45;     private static final int write_timeout = 45;     private static final int read_timeout = 45;     private static final long cache_size = 10 * 1024 * 1024; // 10 mb      private cache providehttpcache() {         return new cache(app.getinstance().getcachedir(), cache_size);     }      /**      * @return okhttpclient.builder instance of configured http client      */     private okhttpclient provideokhttpclient() {         okhttpclient.builder client = new okhttpclient.builder();         client.connecttimeout(connect_timeout, timeunit.seconds);         client.readtimeout(read_timeout, timeunit.seconds);         client.writetimeout(write_timeout, timeunit.seconds);         client.cache(providehttpcache());         client.addinterceptor(new interceptor() {             @override             public response intercept(chain chain) throws ioexception {                 request request = chain.request();                 if (isconnected(app.getcontext())) {                     request = request.newbuilder().header("cache-control", "public, max-age=" + 60).build();                 } else {                     request = request.newbuilder().header("cache-control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build(); // 1 week                 }                 return chain.proceed(request);             }         });         return client.build();     }      private gson providegsonparser(){         return new gsonbuilder()                 .setdateformat("dd-mm-yyyy 'at' hh:mm")                 .create();     }      /**      * provides singleton instance of retrofit. injected dagger di basedao      * @return retrofit instance create api calls      */     @provides     @singleton     public retrofit provideretrofit() {         retrofit retrofit = new retrofit.builder()                 .baseurl(app.getcontext().getstring(r.string.base_url))                 .client(provideokhttpclient())                 .addconverterfactory(gsonconverterfactory.create(providegsonparser()))                 .build();         return retrofit;     }      private boolean isconnected(context context) {         connectivitymanager cm = (connectivitymanager) context                 .getsystemservice(context.connectivity_service);         if (cm == null) {             return false;         }         networkinfo info = cm.getactivenetworkinfo();         return info != null && info.isconnected();     } } 

inject in activity:

public class mainactivity extends appcompatactivity { @inject retrofit retrofit; private apiservice service;  @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); injecthelper.getrootcomponent().inject(this); // call injecthelper service = retrofit.create(apiservice.class); // use retrofit } 

Comments

Post a Comment

Popular posts from this blog

c# - SelectList with Dictionary, add values to the Dictionary after it's assigned to SelectList -

mysqli - Php Mysqli_fetch_assoc Error : "Warning: Illegal string offset 'name' in" -

javascript - Chart.js - setting tooltip z-index -