在加载其他活动时显示ProgressDialog

时间:2013-06-15 12:38:30

标签: java android android-intent android-activity progressdialog

此问题之前已被问过,但我发现的答案在我的案例中没用。

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

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

2 个答案:

答案 0 :(得分:4)

  

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

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

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

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

答案 1 :(得分: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);
    };
};

}