我想在后台做一个简单的任务,并在完成时显示一个进度条。
这是主要(也是唯一) Activity 的代码:
public class Login extends Activity {
public static ProgressDialog progressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
(...)
this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
progressDialog = new ProgressDialog(activity);
progressDialog.setMessage("Sending data...");
progressDialog.setCancelable(false);
(...)
// In some onClick Eevent..
JSONObject result = new Urltasks().execute(...).get();
(...)
}
}
这是 Activity 的代码:
class Urltasks extends AsyncTask<String, Integer, JSONObject>{
protected void onPreExecute() {
System.out.println("Inicia onPreExecute");
Login.progressDialog.show();
}
protected void onPostExecute(String result) {
Login.progressDialog.dismiss();
}
protected JSONObject doInBackground(String... arg0) {
// Some work being done. I do not use Login.progressDialog here
}
}
使用此代码,ProgressDialog 在任务结束时显示,并且不会关闭。
最佳答案
问题在这里:
JSONObject result = new Urltasks().execute(...).get();
在 AsyncTask
上调用 get()
会阻塞当前线程,即您的 UI 线程,直到执行 AsyncTask。因此进度对话框无法运行。删除 get()
。
要获取 AsyncTask 的结果,您可以例如将监听器回调传递给在结果可用时收到通知的异步任务:
class YourAsyncTask extends AsyncTask<ParamType, ProgressType, ResultType> {
private YourResultListener mListener;
interface YourResultListener {
void onResultAvailable(ResultType result);
}
YourAsyncTask(YourResultListener listener) {
mListener = listener;
}
@Override protected ResultType doInBackground(ParamType... params) {
//...
}
@Override protected void onPostExecute(ResultType result) {
mListener.onResultAvailable(result);
}
}
你可以像这样使用它:
mProgressDialog.show();
new YourAsyncTask(new YourResultListener() {
@Override void onResultAvailable(ResultType result) {
mProgressDialog.dismiss();
// use result
}).execute(params);
就我个人而言,我喜欢将进度对话框等用户界面元素与异步任务分离。
关于java - ProgressBar 在 AsyncTask 期间不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838618/