如何在显示所有视图后启动另一个活动

时间:2015-01-04 00:36:45

标签: android

我有一个带有进度条和两个标签的存根活动,以及另一个可能执行繁重任务的活动(在第一次启动时从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); 

2 个答案:

答案 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..); 
}