【问题标题】:ProgressDialog not showingProgressDialog 不显示
【发布时间】:2011-08-06 17:22:55
【问题描述】:

当我的应用程序第一次启动时,它需要进行一些设置。我想在发生这种情况时显示一个进度对话框,因此用户不仅面临无响应的黑屏。我正在尝试使用以下代码执行此操作,但对话框从未显示:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.shell);
    final ProgressDialog dialog = ProgressDialog.show(WhereWolfActivity.this, getString(R.string.loadingtitle), getString(R.string.loading), true, false);
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            if(dbHelper == null)
                dbHelper = new WhereWolfOpenHelper(getApplicationContext());                    
            checkUserDetails();
            String providers = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            checkLocationProviders(providers);
            runOnUiThread(new Runnable(){
                @Override
                public void run() {
                    dialog.dismiss();
                }                   
            });     
        }
    });
    thread.start();
}

如果我删除dialog.dismiss();,则线程完成后会显示对话框。这向我表明 UI 线程被阻止了。任何想法如何解决这一问题?谢谢。

【问题讨论】:

    标签: android multithreading progressdialog


    【解决方案1】:

    请试试这个并报告

    ProgressDialog dialog;
    Context mContext = this;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.shell);
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable(){
                    @Override
                    public void run() {
                        dialog = ProgressDialog.show(mContext, getString(R.string.loadingtitle), getString(R.string.loading), true, false);
                    }                   
                });
                if(dbHelper == null)
                    dbHelper = new WhereWolfOpenHelper(getApplicationContext());                    
                checkUserDetails();
                String providers = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
                checkLocationProviders(providers);
                runOnUiThread(new Runnable(){
                    @Override
                    public void run() {
                        dialog.dismiss();
                    }                   
                });     
            }
        });
        thread.start();
    }
    

    【讨论】:

    • 我试过了,但它引入了一个新问题:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()。我相信这是因为 checkUserDetails() 方法想要创建一个 Dialog (它并不总是这样做,因为它取决于数据库查询,所以这可能是一个刚刚显示的现有问题......)
    • 尝试在运行开始时添加 Looper.prerpare()
    【解决方案2】:

    您的代码在 2.3.3 三星 Galaxy S i9000 上运行良好,我刚刚检查过(显然,没有数据库的东西 - 只是在 runOnUIThread 之前的 Thread.sleep())。

    由于这个答案不是很有帮助,让我给你指点 AsyncTask 类,它是为你目前正在“手工”完成的任务而创建的。

    基本上,您创建 AsyncTask 的子类(作为活动的内部类) - 如果您不需要任何参数,只需使用 Void,Void,Void - 并在 onCreate() 和 .execute() 中启动它;

    在 onPreExecute() 中启动你的进度对话框,在 doInBackground 中做你的后台工作,最后在 onPostExecute() 中关闭对话框。不用摆弄 runOnUIThread。

    【讨论】:

    • 我尝试使用 AsyncTask,但随后应用程序继续运行,然后在遇到下一个 AsyncTask 时崩溃 - 这需要在第一个中设置内容!我需要应用程序在此处停止并加载内容,同时显示 ProgressDialog,以便用户知道它为什么停止,然后继续
    • 在 runOnUIThread() 之前尝试使用 Thread.sleep(2000) 而不是整个 DB/Location 代码?如果这对你有用,那么我们可能在你的代码和 UI 线程之间有一些不需要的交互,这会以某种方式阻止显示进度对话框。
    • 不,那没用。我在 Thread.sleep(2000) 之前和之后放置了日志语句,以便我可以看到它正在执行,但屏幕只是空白 - 在模拟器和我的 HTC Wildfire S 上进行了测试
    • 您使用的是哪个安卓版本?另一个想法是将代码移动到 onResume(),即稍后进入活动的生命周期。该活动在 onCreate 中尚未真正可见,请参阅生命周期 (developer.android.com/reference/android/app/…)。
    • 我在 onStart 中测试了线程(只是在睡眠中),它成功了!我需要在 onCreate 中运行一些我想要 ProgressDialog 的代码 - 我将对其进行修改以稍后运行,以便在 ProgressDialog 运行时显示它。感谢您的帮助!
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多