0

我无法将此问题放入可搜索的术语中。我正在开发一个 Android 应用程序,特别是我的应用程序的启动画面。应用程序需要从外部 Web 服务(阻塞函数调用)获取数据,同时用户会得到一个漂亮的标题、图像和进度条。当数据到达时,用户被重定向到主菜单。它是一个简单的屏幕,所有内容都在 xml 布局文件中定义,我的问题是我只是黑屏几秒钟,然后是主菜单。如果我按回去,我会看到进度条愉快地旋转的启动画面。

这是我到目前为止所拥有的:

public class SplashActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
    }

    @Override
    public void onStart(){
        super.onStart();
        DatabaseManager db = new DatabaseManager(this.getBaseContext());
        db.fetchExternCatalog(); //doesnt return until data arrives
        Intent intent = new Intent().setClass(this, MainMenuActivity.class);
        startActivity(intent);
    }
}

似乎直到 Activity 运行(在 onCreate()、onStart() 等之后)才真正绘制屏幕。我认为 onStart() 将是放置这个的完美位置,但显然不是。

那么如何在屏幕上绘制所有内容并在之后调用阻塞函数,以便用户在下载数据时真正看到启动画面?

4

2 回答 2

0

您需要使用 ProgressDialog 类来构建对话框,然后在线程内运行阻塞方法。

我将在一分钟内发布一个示例(必须靠近 PC:p)

    private void showSplash(){

    progressDialog = ProgressDialog.show(this, "Hello! ima title", "Im the message you see.");
    progressDialog.show();

    Thread t = new Thread(new Runnable(){                   
        public void run(){
            // Put your blocking method here.
            // You may need to build in a "hey, im done downloading" variable to get it to close down right
    progressDialog.dismiss();
    }
}); 
t.start();
}
于 2012-04-09T18:30:08.433 回答
0

您将锁定 UI 线程,这就是我相信您看到黑屏的原因。使用 AsyncTask 或为数据库操作创建自己的线程池。

至于点击后退按钮并查看您的旧活动,您需要告诉 android 不要将活动存储在它的堆栈中。这应该有助于:

http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

于 2012-04-09T18:32:53.373 回答