2015-10-12 41 views
5

当我尝试在实现类中注入接口时,总是收到空指针异常。这里是我的代码:Dagger 2 - 在实现类中注入接口 - “尝试在空对象引用上调用接口方法”

获取:

空指针错误在行LoginManagerImpl类:
@覆盖
公共字符串getLoginResponse(字符串请求){
回报networkManager.getLoginResponse(请求) ;
}

这里NETWORKMANAGER总是空,你可以请看代码。

下面是我的源代码:

public class LoginActivity extends Activity { 

    @Inject 
    NetworkManager networkManager; 

    @Inject 
    LoginManager loginManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getApplicationComponent().inject(this); 

     loginManager.getLoginResponse("valid Login Request"); 
    } 
} 

public interface NetworkManager 
{ 
    String getLoginResponse(String request); 
    String getUserDetailResponse(String request); 
    String getABCResponse(String request); 
} 

public interface LoginManager 
{ 
    String getLoginResponse(String request); 
} 

public class LoginManagerImpl implements LoginManager { 
    @Inject 
    NetworkManager networkManager; 

    public LoginManagerImpl(Context context) 
    { 

    } 

    @Override 
    public String getLoginResponse(String request) { 
     return networkManager.getLoginResponse(request); 
    } 
} 

public class NetworkManagerImpl implements NetworkManager { 

    public NetworkManagerImpl(Context context) 
    { 

    } 
    @Override 
    public String getLoginResponse(String request) { 
     return "valid login response fetched from server"; 
    } 

    @Override 
    public String getUserDetailResponse(String request) { 
     return "valid user deails"; 
    } 

    @Override 
    public String getABCResponse(String request) { 
     return "valid ABC request response"; 
    } 
} 

@Module 
public class AppModule { 

    DaggerApplication application; 

    public AppModule(DaggerApplication application) { 
     this.application = application; 
    } 

    @Provides 
    @Singleton 
    DaggerApplication provideDaggerApplication() { 
     return application; 
    } 

    @Provides 
    @Singleton 
    public Context provideApplicationContext() 
    { 
     return application.getApplicationContext(); 
    } 

    @Provides 
    @Singleton 
    public LoginManager providesLoginManager(Context context) 
    { 
     return new LoginManagerImpl(); 
    } 

    @Provides 
    @Singleton 
    public LoyaltyCardManager providesLoyaltyCardManager(Context context) 
    { 
     return new LoyaltyCardManagerImpl(context); 
    } 

    @Provides 
    @Singleton 
    public NetworkManager providesNetworkManager(Context context) 
    { 
     return new NetworkManagerImpl(context); 
    } 
} 

@Singleton 
@Component(
     modules = { 
       com.dagger.component.AppModule.class 
     }) 
public interface ApplicationComponent { 
    void inject (LoginActivity activity); 

    NetworkManager getNetworkManager(); 
    LoginManager getLoginManager(); 
} 

回答

4

有两种方式供您让匕首注入像networkManager字段依赖性为LoginManagerImpl

  1. 标注它的构造与@Inject和改变providesLoginManager(Context)

    @Provides @Singleton 
    LoginManager providesLoginManager(LoginManagerImpl manager) { 
        return manager; 
    } 
    

    这将意味着匕首将提供LoginManagerImpl,和你的@Provides方法结合LoginManager了这一点。

  2. 如果你想在自己providesLoginManager(Context)实例LoginManagerImpl,然后还要求MembersInjector<LoginManagerImpl>,并用它来注入领域,如networkManager

    @Provides @Singleton 
    LoginManager providesLoginManager(Context context, MembersInjector<LoginManagerImpl> membersInjector) { 
        LoginManagerImpl manager = new LoginManagerImpl(context); 
        membersInjector.injectMembers(manager); 
        return manager; 
    } 
    

对于你的榜样,我建议选择1# 。使用MembersInjector对于不能让Dagger实例化的类非常有用,例如Android Activities。

0

现场注入不是自动的。您需要通过构造函数提供这些依赖项,或者您需要在构造函数中手动启动字段注入。

public class LoginActivity extends Activity {  
    @Inject 
    NetworkManager networkManager; 

    @Inject 
    LoginManager loginManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getApplicationComponent().inject(this); 

     loginManager.getLoginResponse("valid Login Request"); 
    } 
} 

public interface NetworkManager 
{ 
    String getLoginResponse(String request); 
    String getUserDetailResponse(String request); 
    String getABCResponse(String request); 
} 

public interface LoginManager 
{ 
    String getLoginResponse(String request); 
} 

public class LoginManagerImpl implements LoginManager { 
    @Inject 
    NetworkManager networkManager; 

    public LoginManagerImpl(Context context) {  

     ((DaggerApplication)context).getApplicationComponent().inject(this); 
    } 

    @Override 
    public String getLoginResponse(String request) { 
     return networkManager.getLoginResponse(request); 
    } 
} 

public class NetworkManagerImpl implements NetworkManager { 

    public NetworkManagerImpl(Context context) 
    { 
     ((DaggerApplication)context).getApplicationComponent().inject(this);  } 
    @Override 
    public String getLoginResponse(String request) { 
     return "valid login response fetched from server"; 
    } 

    @Override 
    public String getUserDetailResponse(String request) { 
     return "valid user deails"; 
    } 

    @Override 
    public String getABCResponse(String request) { 
     return "valid ABC request response"; 
    } 
} 

@Module 
public class AppModule { 

    DaggerApplication application; 

    public AppModule(DaggerApplication application) { 
     this.application = application; 
    } 

    @Provides 
    @Singleton 
    DaggerApplication provideDaggerApplication() { 
     return application; 
    } 

    @Provides 
    @Singleton 
    public Context provideApplicationContext() 
    { 
     return application.getApplicationContext(); 
    } 

    @Provides 
    @Singleton 
    public LoginManager providesLoginManager(Context context) 
    { 
     return new LoginManagerImpl(); 
    } 

    @Provides 
    @Singleton 
    public LoyaltyCardManager providesLoyaltyCardManager(Context context) 
    { 
     return new LoyaltyCardManagerImpl(context); 
    } 

    @Provides 
    @Singleton 
    public NetworkManager providesNetworkManager(Context context) 
    { 
     return new NetworkManagerImpl(context); 
    } 
} 

@Singleton 
@Component(
     modules = { 
       com.dagger.component.AppModule.class 
     }) 
public interface ApplicationComponent { 
    void inject(LoginManagerImpl loginManagerImpl); 
    void inject(NetworkManagerImpl networkManagerImpl); 
    void inject (LoginActivity activity); 

    NetworkManager getNetworkManager(); 
    LoginManager getLoginManager(); 
} 

或者你必须为他们提供构造函数参数列表上

@Provides 
    @Singleton 
    public LoginManager providesLoginManager(Context context, NetworkManager networkManager) 
    { 
     return new LoginManagerImpl(context, networkManager); 
    } 
0

我能够加入android:name="my_application_class_name"在AndroidManifest文件的应用程序标签来纠正错误。

相关问题