当我更新我的数据库时,我想要显示一个进度对话框。我的问题是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();
发布于 2012-01-12 16:41:40
我已经用this answer of Vladimir Ivanov解决了这个问题。我已经通过外观分离了功能。我在doInBackground()中保留了功能(下载新数据),在onPostExecute()中更新了列表:获取名为setListAdaper()和notifyDataSetChanged的新适配器。当然,我不再使用runOnUiThread()了。感谢所有人的提示。
发布于 2012-01-12 01:06:22
好的,我想这是
新的Runnable(
runOnUiThread(){
是导致这种行为的原因。
doInBackground()在主UI线程的新线程中执行代码。然后将在此线程中执行的代码放回主线程中,导致进度对话框在结束时延迟,然后在postExecute()中立即关闭。
在这里可以找到一个很好的asyntask教程。
发布于 2012-01-12 01:08:42
您不能使用runOnUiThread。你基本上要做的是:
RefreshDataBase)并阻止UI。您应该直接调用RefreshDataBase()。如果此方法触及UI,则必须对其进行重构。
https://stackoverflow.com/questions/8823365
复制相似问题