square/dagger. Android. java.lang.StackOverflowError -
trying use dagger dependency injector android. extended application class:
public class myapplication extends application { private objectgraph objectgraph; protected list<object> getmodules() { list<object> objectarraylist = new arraylist<object>(); objectarraylist.add(new androidmodule(this)); objectarraylist.add(new devicemodule()); return objectarraylist; } @override public void oncreate() { super.oncreate(); objectgraph = objectgraph.create(getmodules().toarray()); } public void inject(object object) { objectgraph.inject(object); } }
this modules:
androidmodule
@module(library = true) public class androidmodule { private final myapplication myapplication; public androidmodule(myapplication myapplication) { this.myapplication = myapplication; } @provides @singleton @forapplication public context provideapplicationcontext() { return myapplication.getapplicationcontext(); } @provides @singleton public locationmanager providelocationmanager() { return (locationmanager)myapplication.getsystemservice(context.location_service); } @provides public networkinfo providenetworkinfo() { connectivitymanager connectivitymanager = (connectivitymanager)myapplication.getsystemservice(context.connectivity_service); return connectivitymanager.getactivenetworkinfo(); } }
devicemodule
@module(injects = mainactivity.class, complete = false, library = true) public class devicemodule { @provides public systemvalidator providesystemvalidator() { return new androidsystemvalidator(); } @provides public device providedevice(systemvalidator systemvalidator) { return new device(systemvalidator); } }
device class
public class device { private final systemvalidator systemvalidator; @inject public device(systemvalidator systemvalidator) { this.systemvalidator = systemvalidator; } public void validate() { boolean isgpsturnedon = systemvalidator.isgps(); boolean isnetworkactive = systemvalidator.isnetwork(); } }
systemvalidator class
public class androidsystemvalidator implements systemvalidator { @inject locationmanager locationmanager; @inject networkinfo networkinfo; @override public boolean isnetwork() { return (null != networkinfo && (networkinfo.gettype() == connectivitymanager.type_mobile)); } @override public boolean isgps() { return locationmanager.isproviderenabled(locationmanager.gps_provider); } }
this piece of successfuly compiles, on runtime java.lang.stackoverflowerror
trying inject mainactivity
object objectgraph
java.lang.stackoverflowerror @ com.xxxx.app.modules.system.devicemodule$$moduleadapter$providedeviceprovidesadapter.get(devicemodule$$moduleadapter.java:77) @ com.xxxx.app.modules.system.devicemodule$$moduleadapter$providedeviceprovidesadapter.get(devicemodule$$moduleadapter.java:113) @ com.xxxx.app.modules.system.devicemodule$$moduleadapter$providedeviceprovidesadapter.get(devicemodule$$moduleadapter.java:77) @ com.xxxx.app.modules.system.devicemodule$$moduleadapter$providedeviceprovidesadapter.get(devicemodule$$moduleadapter.java:113) @ com.xxxx.app.modules.system.devicemodule$$moduleadapter$providedeviceprovidesadapter.get(devicemodule$$moduleadapter.java:77) @ com.xxxx.app.modules.system.devicemodule$$moduleadapter$providedeviceprovidesadapter.get(devicemodule$$moduleadapter.java:113)
edited:
code changhed working solution though locationmanager
, networkinfo
objects marked @inject
, null. tried tell androidmodule
place these object adding injects = androidsystemvalidator.class
didn't work out. how can inject these objects without creating paramatrized construtor?
i think issue
@provides public device providedevice(device device) { return device; }
where device come from? need make new instance @ point.
for device , androidsystemvalidator, think should inject them using constructor. if want use dagger like
@inject public device(systemvalidator systemvalidator) { this.systemvalidator = systemvalidator; }
otherwise use modules similar have change
@provides public device providedevice(systemvalidator systemvalidator) { return new device(systemvalidator); }
Comments
Post a Comment