当我更新我的数据库时,我想显示一个进度对话框。我的问题是ProgressDialog出现迟到了,在4-5秒之后,然后出现并且消失的速度非常快,它在屏幕上几毫秒几乎看不到它,然后立即在列表中显示新数据。这让我觉得ProgressDialog正在等待数据库更新(它不需要花费太多,大约4.5秒)然后它会在屏幕上显示但是很快就会消失。我想立即显示ProgressDialog我按下“更新”按钮并在屏幕上停留4-5秒。
class MyAsyncTask extends AsyncTask<Void, Void, Void>{
ProgressDialog myprogsdial;
@Override
protected void onPreExecute(){
myprogsdial = ProgressDialog.show(MyActivity.this, null, "Upgrade", true);
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
RefreshDataBase();
}
});
return null;
}
@Override
protected void onPostExecute(Void result){
myprogsdial.dismiss();
}
}
当我打电话时,new MyAsyncTask().execute();
答案 0 :(得分:6)
好的,我认为这个
runOnUiThread(new Runnable(){
导致此行为。
doInBackground()在新的线程中执行代码到主UI线程。然后,您将在此线程中执行的代码放回到主线程中,导致进度对话框在结束时被延迟,然后在postExecute()中立即关闭。
可以在这里找到一个好的asyntask教程。
答案 1 :(得分:2)
您不得使用runOnUiThread
。你基本上做的是:
RefreshDataBase
)并阻止UI。您应该直接致电RefreshDataBase()
。如果此方法触及UI,则必须重构它。
答案 2 :(得分:1)
我使用this answer of Vladimir Ivanov解决了这个问题。
我已经通过外观分离了功能。
我保留了doInBackground()
和onPostExecute()
中的功能(下载新数据)我更新了列表:获取名为setListAdaper()
和notifyDataSetChanged
的新适配器。
当然,我退出使用runOnUiThread()
。感谢所有提示。