在Java代码中,我执行了一个AsyncTask类,并且在返回的结果中,我在onPostexecute方法中对自身进行了递归调用。例如:
MainActivity.java
public void button_clicked(){
UploadAsync send_data = new UploadAsync(MainActivity.this);
send_data.execute("send first data", user_data, file_path);
}
UploadAsync.java
@Override
protected String doInBackground(String... params) {
String task = params[0];
if(task.equals("send first data"){
String user_data = params[1];
String file_path = params[2];
//send in the user_data to a php file
}else if(task.equals("send file"){
String file_path = params[1];
//send the file_path to another php file
}
}
@Override
protected void onPreExecute() {
ProgressDialog pd = ProgressDialog.show(context, "Sending", "Please wait");
}
@Override
protected void onPostExecute(String result) {
if(result.equals("data sent"){
UploadAsync send_data = new UploadAsync(context);
send_data.execute("send file", file_path);
}else{
//show error
}
pd.dismiss();
}
上面的代码只是一个例子。现在的问题是,实现此示例将运行两次进度对话框。我已经尝试了很多方法只在AsyncTask发送用户数据和文件路径时显示进度对话框,但我没有成功。有没有关于如何正确实现这一点的建议?
答案 0 :(得分:0)
在执行新的pd.dismiss()
之前,您无法致电ProgressDialog
并解除UploadAsync
当前UploadAsync
吗?
答案 1 :(得分:0)
首先在onPostExecute中,关闭对话框,然后像这样启动新的asynctask:
@Override
protected void onPostExecute(String result) {
pd.dismiss();
if(result.equals("data sent"){
UploadAsync send_data = new UploadAsync(context);
send_data.execute("send file", file_path);
}else{
//show error
}
}
我希望这会对你有所帮助。
答案 2 :(得分:0)
将ProgressDialog
作为全球数据。
private ProgressDialog pd;
@Override
protected void onPreExecute() {
// show the ProgressDialog
if (pd == null) {
pd = ProgressDialog.show(context, "Sending", "Please wait");
}
}
@Override
protected void onPostExecute(String result) {
if (result.equals("data sent") {
UploadAsync send_data = new UploadAsync(context);
send_data.execute("send file", file_path);
}else{
//show error
}
// edited here ,make the ProgressDialog dismiss
if (pd.isShowing() && pd != null) {
pd.dismiss();
pd = null;
}
}
答案 3 :(得分:0)
在这种情况下,使用异步任务和调用者之间的回调机制(此处为MainActivity
)。
按照我在下面解释的那样实施。
使用interface
定义showProgressDiaglog()
和
DismissProgressDialog()
方法。
MainActivity
实现了这个接口并实现了这两个接口
分别显示和解除进度对话框的方法。
在setter method
课程中定义AsyncTask
并调用此setter
来自MainActivity
的方法通过this
(这是指
在creating the AsyncTask instance and before
calling execute method.
存储传递的接口实现之后的MainActivity)
AsyncTask类作为实例变量。
修改AsyncTask构造函数以传递任务类型而不是传递 在execute方法中将此任务类型存储在AsyncTask中 实例变量。
现在来自AsyncTask构造函数,onPreExecute()
方法,根据任务类型调用showProgressDialog()
方法。
并在onPostEecute()
方法调用中dismissProgressDialog()
取决于任务类型。