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

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -