ProgressDialog没有显示

时间:2011-08-06 17:22:55

标签: android multithreading progressdialog

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

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线程被阻止了。任何想法如何解决这一问题?感谢。

2 个答案:

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

答案 1 :(得分:0)

您的代码在2.3.3三星Galaxy S i9000上工作正常,我刚刚检查过(没有数据库的东西,很明显 - 只是在runOnUIThread之前的Thread.sleep())。

由于这个答案不是很有帮助,所以让我指出为你目前正在“手工”完成的任务创建的课程AsyncTask

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

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