我有一个带有进度条和两个标签的存根活动,以及另一个可能执行繁重任务的活动(在第一次启动时从xml资源初始化sqlite db)。
我需要在显示进度条和标签后开始第二个活动。
我正在尝试
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);
}
});
但是当重度活动开始时我看到空屏幕。 我做错了什么?
我自己已经找到了解决方案。
我发现系统创建db不在db helper的get实例上,而是在第一次查询时。
解决方案是在AsyncTask中初始化db并在post execute:
上启动第二个活动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);
答案 0 :(得分:0)
尝试以下方法:
@Override
public void onWindowFocusChanged (boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus ){
// start your new activity
}
}
当窗口获得焦点时调用此方法,这是在显示所有视图之后调用的。
答案 1 :(得分:0)
我可以使用启动时显示的进度条SplashActivity
来调用您的活动。在此活动中,您应该在AsyncTask
中完成繁重的任务(sql初始化)。完成AsyncTask
后,只需将您的其他活动调用即可显示。
一些代码:
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..);
}