我在按钮点击上有一个Fragment类我应该显示一个包含内容的tableview,这将花费4秒或更长的时间跨度,具体取决于要显示的内容。所以我想在按钮点击后显示progressDialog并在执行方法后解除。
但是这个过程在延迟之后出现,就像在tableview出现之后那样。所以显示进度条有延迟。我尝试过这么多方法仍然没有运气。
以下是我正在尝试的代码。
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.btn_spreadsheetAddTable: {
//Some code
}
break;
case R.id.btn_horizontalAddTable: {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPreExecute() {
mProgressDialog = new ProgressDialog(getActivity());
mProgressDialog.setTitle("Processing...");
mProgressDialog.setMessage("Please wait.");
mProgressDialog.setCancelable(false);
mProgressDialog.setIndeterminate(true);
mProgressDialog.show();
displayAddTableView(editIsEnabled);
}
@Override
protected void onPostExecute(Void result) {
if (mProgressDialog!=null) {
mProgressDialog.dismiss();
}
}
};
task.execute((Void[])null);
editIsEnabled = false;
}
private void displayAddTableView(boolean editEnabled) {
//A code to display dynamic table with dynamic data
}
}
我也尝试过以下网址:
android - Progressbar Late Loading when button click
Loading Dialog, Progress Dialog on Button Click
ProgressDialog doesn't appear immediately
请帮帮我。谢谢。
答案 0 :(得分:1)
你说这需要4秒才能显示出来。听起来像你在做什么应该在后台线程中完成,而不是UI线程。也许您想在displayAddTableView(editIsEnabled);
中执行doInBackground
,并发布任何UI更新。
mProgressDialog.show()
会将消息发布到UI消息队列,这意味着如果您的UI线程正忙于运行displayAddTableView(editIsEnabled);
,则进度微调器将不会显示(或将显示为瞬间在 displayAddTableView(editIsEnabled);
完成运行后。)
答案 1 :(得分:0)
可能是你的设备或模拟器很慢。你可以先启动进度对话框,然后在onPreExecute上显示:
ProgressDialog mProgressDialog;
.
.
. //in oncreate
mProgressDialog = new ProgressDialog(getActivity());
mProgressDialog.setTitle("Processing...");
mProgressDialog.setMessage("Please wait.");
mProgressDialog.setCancelable(false);
mProgressDialog.setIndeterminate(true);
.
.
.
protected void onPreExecute() {
mProgressDialog.show();
答案 2 :(得分:0)
我已经通过添加Toast并在UIThread中运行表设计代码来修复此问题,因为无法显示进度,因为我的自定义表和进度的设计都需要在同一个线程中运行。
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.btn_spreadSheetAddRow: {
Toast.makeText(this,
"Loading",
Toast.LENGTH_SHORT).show();
final Thread uiThread = new Thread(new Runnable() {
@Override
public void run() {
uiHandler.postDelayed(new Runnable() {
@Override
public void run() {
//Call the heavy table design code;
Toast.makeText(getApplicationContext(),
"Done",
Toast.LENGTH_SHORT).show();
}
}, 80);
}
});
uiThread.start();
}
break;