我想在Activity
中创建一个静态presenter对象,这样当由于配置更改而重新创建Activity
时,它将保留presenter实例,并且我的业务逻辑不会受到影响。
我Activity
的代码是:
public class HomeActivity extends AppCompatActivity {
public static HomePresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
if (presenter == null){
presenter = new HomePresenter();
}
}
}
答案 0 :(得分:1)
静态实例不会发生任何事情。但是,如果不删除对静态演示者的引用,这样做可能会泄漏内存(请参阅Avoiding memory leaks)。
我会建议另一种方法。由于配置更改(例如,旋转),在onRetainNonConfigurationInstance()
被销毁时覆盖Activity
以保留对象。并且在配置更改后使用getLastNonConfigurationInstance()
来获取完全相同的对象。
public class HomeActivity extends AppCompatActivity {
public HomePresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
presenter = (HomePresenter)getLastNonConfigurationInstance();
if (presenter == null){
presenter = new HomePresenter();
}
}
@Override
public Object onRetainNonConfigurationInstance() {
return presenter;
}
}
您还可以使用Fragment
在配置更改期间保持对象处于活动状态,请参阅RetainingAnObject。
答案 1 :(得分:0)
你的代码会有效,主持人会活着,但是,请不要这样做。
关键字'static'表示该字段的值将附加到类,而不是它的实例。因此,如果您将拥有HomeActivity,那么您将转到SomeElseActivity,然后转到新的HomeActivity(您将拥有HomeActivity - > SomeElseActivity - > HomeActivity)用于新的HomeActivity,您将拥有与旧的HomeActivity相同的演示者。因此,您将拥有2个独立HomeActivity实例的共享演示者。此外,如果您在演示者中有某种状态,那么在这种情况下您的应用程序会遇到很多问题。
我建议您删除'static'关键字。如果您的演示者有状态,那么在配置更改期间需要保存,请尝试以下两种选择之一:
1)在演示者中创建onSaveInstanceState和onRestoreInstance状态,并使用适当的活动方法调用它们
2)创建没有ui的片段,但是使用标记'retain instace'(setRetainInstance方法),这个片段将继续引用你的演示者。
答案 2 :(得分:0)