gpt4 book ai didi

android - 我是否正确地在 Activity 代码中进行依赖注入(inject)?

转载 作者:行者123 更新时间:2023-11-28 20:36:07 25 4
gpt4 key购买 nike

我目前正在编写我的第一个 android 项目,我想根据依赖注入(inject)模式对其进行重构。从我的应用程序中最简单的 Activity 开始 - 初始屏幕 - 我问自己,我是否正确理解了模式的概念。

到目前为止,这是我的 SplashActivity 的代码:

public class SplashActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);

Fragment fragmentToDisplay = null;
if (!(getIntent().getBooleanExtra("isLaunch", true))) {
fragmentToDisplay = new LoginFragment();
} else {
if (savedInstanceState == null) {
fragmentToDisplay = new SplashFragment();
}
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
}
}

根据 IntentExtra "isLaunch" 的内容,我想显示不同的 fragment 。现在,我读到每一个 new ServiceXY() 都会使代码的可测试性降低,这实际上不是依赖注入(inject)的目标。所以我重构了我的代码:

public class SplashActivity extends AppCompatActivity {

private SplashFragment splashFragment;
private LoginFragment loginFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);

splashFragment = new SplashFragment();
loginFragment = new LoginFragment();

Fragment fragmentToDisplay = null;
if (!(getIntent().getBooleanExtra("isLaunch", true))) {
fragmentToDisplay = loginFragment;
} else {
if (savedInstanceState == null) {
fragmentToDisplay = splashFragment;
}
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
}
}

然而,这似乎并没有太大的不同。如果我想测试,如果显示正确的 fragment ,这如何提高我的代码的可测试性?感谢转发。

最佳答案

您是对的,您的更改不会产生太大影响,也不会注入(inject)依赖项。由于您的 SplashActivity 对象负责创建 fragment ,因此它们仍然依赖于 SplashActivity 对象。

如果你想使用依赖注入(inject),你必须在 SplashActivity 之外的某个地方创建 fragment 对象,然后将它们传递到对象中。

根据依赖注入(inject)原则,您的服务将是 fragment 类型,使用该服务的客户端将是 SplashActivity,因此您需要另一个对象将正确的服务“注入(inject)”到客户端。 https://stackify.com/dependency-injection/

您可以使用第一个 fragment 中的代码,而不是检查 oncreate 中的 bool 值来设置正确的 fragment 类型,您可以简单地将 fragment 对象传递到 splashactivity 类中,然后转到 fragmentToDisplay = fragmentPassedIntoClass。然后您可以测试传递到类中的 fragment 是否是正确的类型,以及事务是否正确开始。注入(inject)器将负责传递正确的 fragmentPassedIntoClass

MainFragment fragment;
if(splash){ fragment = new SplashFragment(); }
if(login){fragment = new LoginFragment(); }

// Pass fragment variable into splash activity
SplashActivity activty = new SplashActivity(fragment);

public class SplashActivity{
MainFragment mFragment;

public SplashActivty(MainFragment fragment){
mFragment = fragment;
}
}

关于android - 我是否正确地在 Activity 代码中进行依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com