2

之前已经提出过这个问题,但我找到的答案对我来说没有用。

当用户在 Activity 1 中按下按钮时,将打开 Activity 2。活动 2 必须加载一些已存储在 SharedPreferences 中的数据。Activity 2 必须在 onCreate() 中做很多事情,所以这就是为什么打开它需要一点时间(尤其是在速度较慢的设备上)。与我见过的其他情况不同,Activity 不必从 Internet 下载数据,因此我不能选择使用 AsyncTask,因为打开 Activity 需要很长时间的原因不是 Internet,但原因是必须加载 5 个列表视图,并且必须进行大量计算才能正确处理数据。

那么在这种情况下,如何在加载 Activity 2 时显示 ProgressDialog?

4

2 回答 2

4

那么在这种情况下,如何在加载 Activity 2 时显示 ProgressDialog?

这不应该是您关心的问题,因为即使您显示 aProgressDialog它也会简单地冻结,因为您将阻塞主 UI 线程,因为您Activity将难以完成它的工作。如果您知道布局创建/数据构建(或您在onCreate()方法中执行的任何操作)将需要一些时间,用户会注意到:

  • 使您的初始布局包含一个ProgressBar以指示正在向用户完成的工作
  • 启动一个线程/AsyncTask 来完成繁重的工作并退出onCreate()
  • 当线程完成其工作时,构建替换初始布局的布局ProgressBar

这样,您的活动将从工作/加载指示器开始,并在可用时进行布局。也许你也可以改进一些东西(五个ListViews似乎有点奇怪)。

于 2013-06-15T12:50:44.063 回答
0

公共类 TestActivity 扩展 Activity {

ProgressDialog progressDialog;

private Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    context = this;

    showProgress("Data loading...");

    new Thread() {
        public void run() {

            try {

                boolean sucess = loadData();
                if (sucess) {
                    Message alertMessage = new Message();
                    alertMessage.what = 1;
                    handle.sendMessage(alertMessage);
                } else {
                    Message alertMessage = new Message();
                    alertMessage.what = 2;
                    handle.sendMessage(alertMessage);
                }

            } catch (Exception e) {
                // TODO: handle exception
            }

        }
    }.start();

}

private boolean loadData() {

    // load data here
    return true;
}

private void showProgress(String msg) {
    progressDialog = ProgressDialog
            .show(TestActivity.this, null, msg, true);
}

private void hideProgress() {
    if (progressDialog != null)
        progressDialog.dismiss();
}

Handler handle = new Handler() {

    public void handleMessage(android.os.Message msg) {
        hideProgress();
        if (msg.what == 1) {
            Toast.makeText(context, "Data Loaded Sucessfully",
                    Toast.LENGTH_SHORT).show();

        } else if (msg.what == 2) {
            Toast.makeText(context, "Data Loading failed ",
                    Toast.LENGTH_SHORT).show();
        }

        super.handleMessage(msg);
    };
};

}

于 2013-06-15T13:12:56.057 回答