当我的应用程序首次启动时,需要进行一些设置。我想在发生这种情况时显示进度对话框,因此用户不仅面临无响应的黑屏。我正在尝试使用以下代码执行此操作,但对话框从不显示:
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线程被阻止了。任何想法如何解决这一问题?感谢。
答案 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。