我有一个SplashActivity,可以创建自定义CommerceObjects的ArrayList。此列表将用于应用程序的其余部分,用于不同的活动和片段。问题是,有时,当应用程序被停顿然后重新启动时,对象列表显示为未初始化。解决方案是检查ArrayList是否为null,如果为null,则强制SplashActivity再次启动并重新生成ArrayList。我尝试在其余的活动中使用onRestart方法执行此操作,但根本不工作。
例如,如果ArrayList(在SplashActivity中创建)为null,这就是我在MainActivity中检查的方式。
public class MainActivity extends AppCompatActivity {
...
@Override
protected void onRestart() {
// If the full list of commerces is null or is empty, launch the SplashActivity.
// Here check if the ArrayList of CommerceObjects is null
if (SplashActivity._commerces == null || SplashActivity._commerces.size() == 0) {
Intent mIntent = new Intent(MainActivity.this, SplashActivity.class);
startActivity(mIntent);
this.finish();
}
super.onRestart();
}
...
}
因此,要检查的数组列表是" _commerces "。它在SplashActivity 中将标记为公共静态。我需要检查是否为空,不管堆栈前面当前有什么片段或活动。
我失踪了什么?
答案 0 :(得分:1)
<强>更新强>
我建议您使用onStart()
。
如果App进程被Android操作系统杀死,则不会调用onRestart()
。
https://developer.android.com/reference/android/app/Activity.html
<强> ORIGINAL 强>
静态变量将由Android OS初始化 见:static variable null when returning to the app
所以我建议你避免使用静态变量。 创建Application类并在Application实例中保存CommerceObjects。
以下代码说明。
制作您的应用类:
public class App extends Application {
private CommerceObjects mCommerces;
public void setCommerces(CommerceObjects commerces) {
mCommerces = commerces;
}
public CommerceObjects getCommerces() {
return mCommerces;
}
public static App get(Context context) {
return (App) context.getApplicationContext();
}
}
在AndroidManifest.xml中设置应用程序名称:
<application
...
android:name=".App">
...
</application>
在您的SplashActivity中初始化商店:
public class SplashActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
initializeCommerces();
}
private void initializeCommerces() {
//do initialize tasks
...
CommerceObjects commerces = ...;
//set CommerceObjects to App
App.get(this).setCommerces(commerces);
//start other Activity. ex) MainActivity
}
}
在花药活动中使用商业:
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//use CommerceObjects
CommerceObjects commerces = App.get(this).getCommerces();
...
}
}