在递归的AsyncTask

时间:2017-10-18 09:07:02

标签: java android

在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发送用户数据和文件路径时显示进度对话框,但我没有成功。有没有关于如何正确实现这一点的建议?

4 个答案:

答案 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() 取决于任务类型。