如何在显示所有视图后开始另一个 activity
How to start another activity after all views shown
我有一个带有进度条和两个标签的存根 activity,还有另一个 activity,它可能会完成繁重的任务(在第一次启动时从 xml 资源初始化 sqlite 数据库)。
我需要在显示进度条和标签后开始第二个 activity。
我在努力
stubLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (progress.getHeight() <= 0 || progress.getWidth() <= 0) return;
if (label1.getHeight() <= 0 || label1.getWidth() <= 0) return;
if (label2.getHeight() <= 0 || label2.getWidth() <= 0) return;
stubLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SongListActivity.class);
startActivity(intent);
}
});
但是我在 activity 重启动时看到空白屏幕。
我做错了什么?
我自己已经找到了解决方案。
我发现系统创建数据库不是在获取数据库助手实例时,而是在第一次查询时。
解决方案是在 AsyncTask 中初始化数据库并在 post 上启动第二个 activity 执行:
AsyncTask<Void, Void, Void> initDbTask = new AsyncTask<Void, Void, Void>(){
SongDBHelper helper;
String[] artists;
@Override
protected Void doInBackground(Void... params) {
helper = SongDBHelper.getInstance(getApplicationContext(), getResources());
artists = helper.getArtistList();
return null;
}
@Override
protected void onPostExecute(Void result) {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SongListActivity.class);
startActivity(intent);
}
};
initDbTask.execute(null, null, null);
尝试以下操作:
@Override
public void onWindowFocusChanged (boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus ){
// start your new activity
}
}
当 window 获得焦点并且显示所有视图之后调用此方法。
我可以用启动时显示的进度条 SplashActivity
调用您的 activity。在此 activity 中,您应该在 AsyncTask
中完成繁重的任务(sql 初始化)。当 AsyncTask
完成后,只需调用您的另一个 activity 即可显示。
一些代码:
SplashActivity
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_activity);
new AsyncTask<Params, Progress, Result>(){
@Override
protected Param doInBackground(Params... params) {
// DO YOUR SQL STUFF HERE
return null;
}
@Override
protected void onPostExecute(Param aParam) {
super.onPostExecute(aVoid);
// DO YOUR NEXT STEP HERE AFTER SQL TASK DONE
}
}.execute(..some parameters..);
}
我有一个带有进度条和两个标签的存根 activity,还有另一个 activity,它可能会完成繁重的任务(在第一次启动时从 xml 资源初始化 sqlite 数据库)。
我需要在显示进度条和标签后开始第二个 activity。
我在努力
stubLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (progress.getHeight() <= 0 || progress.getWidth() <= 0) return;
if (label1.getHeight() <= 0 || label1.getWidth() <= 0) return;
if (label2.getHeight() <= 0 || label2.getWidth() <= 0) return;
stubLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SongListActivity.class);
startActivity(intent);
}
});
但是我在 activity 重启动时看到空白屏幕。 我做错了什么?
我自己已经找到了解决方案。
我发现系统创建数据库不是在获取数据库助手实例时,而是在第一次查询时。
解决方案是在 AsyncTask 中初始化数据库并在 post 上启动第二个 activity 执行:
AsyncTask<Void, Void, Void> initDbTask = new AsyncTask<Void, Void, Void>(){
SongDBHelper helper;
String[] artists;
@Override
protected Void doInBackground(Void... params) {
helper = SongDBHelper.getInstance(getApplicationContext(), getResources());
artists = helper.getArtistList();
return null;
}
@Override
protected void onPostExecute(Void result) {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SongListActivity.class);
startActivity(intent);
}
};
initDbTask.execute(null, null, null);
尝试以下操作:
@Override
public void onWindowFocusChanged (boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus ){
// start your new activity
}
}
当 window 获得焦点并且显示所有视图之后调用此方法。
我可以用启动时显示的进度条 SplashActivity
调用您的 activity。在此 activity 中,您应该在 AsyncTask
中完成繁重的任务(sql 初始化)。当 AsyncTask
完成后,只需调用您的另一个 activity 即可显示。
一些代码:
SplashActivity
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_activity);
new AsyncTask<Params, Progress, Result>(){
@Override
protected Param doInBackground(Params... params) {
// DO YOUR SQL STUFF HERE
return null;
}
@Override
protected void onPostExecute(Param aParam) {
super.onPostExecute(aVoid);
// DO YOUR NEXT STEP HERE AFTER SQL TASK DONE
}
}.execute(..some parameters..);
}