我需要显示进度对话框。这很简单,但我绝对需要等到asictask才能完成。这给我带来了一些困难。等待完成asynctask方法.get()
被使用。但是这个方法blocks
我的进度对话框。
那么,如何使用get取消progressdialog
或使用哪些内容替换.get()
?
我以下列方式呼叫操作:
Operation o = new Operation();
o.execute(params);
try {
o.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
班级操作
class Operation extends AsyncTask<String, Void, JSONObject> {
ProgressDialog pd;
Context con;
@Override
protected void onPreExecute() {
pd = new ProgressDialog(app);
pd.setOwnerActivity(app);
pd.setTitle("Идет загрузка...");
pd.setCancelable(true);
pd.show();
}
@Override
protected JSONObject doInBackground(String... option) {
/*
some job
*/
return json;
}
@Override
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
pd.dismiss();
/*
some job
*/
}
}
答案 0 :(得分:1)
不要使用.get()
,因为您看到它会阻止UI
。如果需要检查任务是否完成,可以使用getStatus()
。删除.get()
应允许ProgressDialog
显示。如果您的代码必须等到AsyncTask
完成后再将其放入onPostExecute()
或从那里调用函数
如果您需要在MainActivity
完成后引用AsyncTask
中的某些内容,只需创建一个构造函数即可引用Activity
并传递context
到你的constructor
Operation o = new Operation(this);
并在构造函数
中引用它lass Operation extends AsyncTask<String, Void, JSONObject> {
ProgressDialog pd;
Context con;
Activity act;
public Operator(Activity curAct)
{
act = curAct; // can use this reference to access methods in your Activity
}
答案 1 :(得分:1)
尝试使用这种方式
private ProgressDialog dialog=null;
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(this, "", "Please! Wait...",true);
}
@Override
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
dialog.dismiss();
// use here code
}
答案 2 :(得分:1)
您可能希望将代码更改为此类代码。 在runnable中包装您想要运行的代码并将其传递给异步任务。
Runnable onEnd = new Runnable(){
//code to run after the task has completed
}
Operation o = new Operation(onEnd);
o.execute(params);
这是修改后的Operation类。
class Operation extends AsyncTask<String, Void, JSONObject> {
ProgressDialog pd;
Context con;
Runnable afterwards = null;
Operation(Runnable afterwards){
this.afterwards = afterwards ;
}
@Override
protected void onPreExecute() {
pd = new ProgressDialog(app);
pd.setOwnerActivity(app);
pd.setTitle("Идет загрузка...");
pd.setCancelable(true);
pd.show();
}
@Override
protected JSONObject doInBackground(String... option) {
/*
some job
*/
return json;
}
@Override
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
pd.dismiss();
/*
some job
*/
if (afterwards != null)
afterwards.run();
}
}
请注意afterwards.run()
中的onPostExecute
。