【问题标题】:Show ProgressDialog while other activity is loading在加载其他活动时显示 ProgressDialog
【发布时间】:2013-06-12 00:03:00
【问题描述】:

以前有人问过这个问题,但我找到的答案对我来说没有用。

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

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

【问题讨论】:

  • 答案是基本上你错了。你的情况和从网上加载完全一样,需要一个AsyncTask做后台处理,同时更新前面的进度条。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,Activity 2 是一个包含 5 个片段的 ViewPager,每个片段都包含一个列表视图,所以为什么加载需要很长时间
  • @Merlin 在这种情况下,请忽略关于五个Listviews 的评论。但是一个 ViewPager 里面有 5 个片段(其中 3 个将随时加载(如果你不搞乱setOffscreenPageLimit()))不应该让活动开始太慢以至于你需要一个进步指标。
  • 嗯,但是在我的 HTC One X 上,需要 2 或 3 秒
  • @Merlin 使用traceview 查看需要这么长时间并将其移至后台线程。
  • 感谢您的提示,我会试试那个!
【解决方案2】:

公共类 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);
    };
};

}

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多