在Android上加载数据时显示旋转轮对话框

时间:2011-05-28 04:48:01

标签: java android dialog loading progress

我想在我的应用加载一些数据时显示一个旋转轮对话框:

Spinning wheel dialog

点击按钮时应显示旋转轮对话框。我正在使用下面的代码,但它现在显示了旋转轮。可能是什么问题?

public void CheckAccount(String username, String password) {
    try {

        final ProgressDialog progDailog = ProgressDialog.show(this,
            "Progress_bar or give anything you want",
            "Give message like ....please wait....", true);
        new Thread() {
            public void run() {
                try {
                    // sleep the thread, whatever time you want. 
                    sleep(1000);
                } catch (Exception e) {
                }
                progDailog.dismiss();
            }
        }.start();

        //getting data code here
        //getting data code here
        //getting data code here
        //getting data code here
        //getting data code here

    } catch (Exception e) {
        Log.e(LOG_TAG, e.getMessage());
        PopIt("CheckAccountError", e.getMessage(), "Denied");
    }
}

3 个答案:

答案 0 :(得分:49)

所以,看到这个答案越来越受欢迎,我决定自己应该自己提高答案的质量。当我看到原文时,我看不到“我的代码中的问题是什么?”这个问题没有真正的“答案”。我将原始答案保留在下面,以保留链接,这是我假设已经导致答案流行。

更新了答案

您可能违反了“单线程模型”。 Android UI Toolkit不是线程安全的,只能从“主”UI线程进行操作。 Android有一些有用的方法可用于确保您的UI操作在UI线程上完成。这些方法调用的大多数细节都可以在Android无痛线程博客文章中找到(链接在下面的'one'和here中以便快速参考)。

查看您的代码,我看到的具体违规是在可能的UI线程中创建ProgressDialog,然后在新创建的后台线程中将其解除。

最好将您的背景方法封装在Runnable中并使用View#post(Runnable)在后台完成工作。

请记住,有很多方法可以做背景,所以看一下可用的方法,并使用适合您情况的方法。

原始答案

look one many tutorials asynchronous work Android Progress dialog problem in Android Progress Dialog on open activity。 / p>

此外,这里有一些类似的其他StackOverflow问题

Progress Dialog while starting new activity

Android: Progress Dialog spinner not spinning

Updating progress dialog

android: showing a progress dialog

{{3}}

{{3}}

答案 1 :(得分:40)

创建。

ProgressDialog dialog = new ProgressDialog(this); // this = YourActivity
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setTitle("Loading");
dialog.setMessage("Loading. Please wait...");
dialog.setIndeterminate(true);
dialog.setCanceledOnTouchOutside(false);

显示。

dialog.show();

解雇。

dialog.dismiss();

答案 2 :(得分:1)

我遇到了在两个活动(活动A和活动B)之间切换的问题。活动B有长时间运行的任务正在更新UI,所以它不是AsyncTask的候选者。我通过在活动A上启动进度对话框并在完成第一个活动之前启动活动B来解决它。该代码看起来像:

            // wrap thread around original code for progress button
            final ProgressDialog ringProgressDialog = ProgressDialog.show(getActivity(), "Working", "Please Wait",
                    true, false);
            ringProgressDialog.setIndeterminate(true);
            new Thread(new Runnable() {
                public void run() {
                    try {

                        Intent startNewActivityOpen = new Intent(getActivity(), ActivityB.class);
                        startNewActivityOpen.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
                        startActivity(startNewActivityOpen);
                        GlobalVars.navigateFromScreen = true;

                        Thread.sleep(3000);


                        if (ringProgressDialog != null && ringProgressDialog.isShowing()) {
                            ringProgressDialog.dismiss();
                        }

                        getActivity().finish();


                    } catch (Exception e) {

                    }

                }

            }).start();