如何在显示所有视图后开始另一个 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..); 
}