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 }
Mobile Applications Development Company in Chennai
ReplyDelete
ReplyDeleteLos automóviles han sido uno de los inventos más importantes del siglo XX.
traslado de autos en madrina
Nice Blog...Waiting for the Next Update..
ReplyDeleteSEO company in Kerala
SEO service in Kerala
SEO services in Kerala