android如何调用接口方法,android – Dagger 2 – 在实现类中注入接口 – “尝试在空对象引用上调用接口方法”...

当我尝试在实现类中注入接口时,我总是得到空指针异常.这是我的代码:

获得:

Nullpointer error in LoginManagerImpl class at line:

@Override

public String getLoginResponse(String request) {

return networkManager.getLoginResponse(request);

}

这里networkManager始终为null,请您查看代码.

以下是我的源代码:

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();

}

解决方法:

有两种方法可以让Dagger将像networkManager字段这样的依赖项注入LoginManagerImpl.

>使用@Inject注释其构造函数并将provideLoginManager(Context)更改为

@Provides @Singleton

LoginManager providesLoginManager(LoginManagerImpl manager) {

return manager;

}

这意味着Dagger将提供LoginManagerImpl,并且您的@Provides方法将LoginManager绑定到该方法.

>如果要在provideLoginManager(Context)中自己实例化LoginManagerImpl,则还请求MembersInjector< LoginManagerImpl>并使用它来注入像networkManager这样的字段:

@Provides @Singleton

LoginManager providesLoginManager(Context context, MembersInjector membersInjector) {

LoginManagerImpl manager = new LoginManagerImpl(context);

membersInjector.injectMembers(manager);

return manager;

}

对于您的示例,我建议选项#1.使用MembersInjector对于你不能让Dagger实例化的类非常有用,比如Android Activities.

标签:android,dagger-2

来源: https://codeday.me/bug/20190516/1116742.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值