java - 确定 LoopJ 何时结束所有后台连接

标签 java android arrays android-asynctask loopj

我试图确定何时 LoopJ已完成所有后台线程 http 调用。这样我就可以显示根据我的 onSuccess 方法的结果填充的数组的结果。

首先,我有一个文件名 String[]。然后我循环遍历数组并创建像这样的loopj连接。

 ArrayList<String> files_to_update = new ArrayList<String>(file_names.length);
 AsyncHttpClient client = new AsyncHttpClient();
    for (final String file_name : file_names) {
            client.get(BASE_URL + file_name, new AsyncHttpResponseHandler() {

            public void onStart() {
                Local_Last_Modified_Date = preferences.getString(file_name, "");
            }

            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                Server_Last_Modified_Date = headers[3].getValue();
            }

            @Override
            public void onFinish() {
                if (!Local_Last_Modified_Date.trim().equalsIgnoreCase(Server_Last_Modified_Date.trim())) {
                    files_to_update.add(file_name);
                }
            }
        });
    }

我在这里所做的是比较 2 个日期字符串,第一个 Local_Last_Modified_Date 是从首选项文件中提取的,第二个由 header 中的最后修改日期确定。然后在 OnFinish() 中进行比较。这确定文件是否需要更新,因为服务器文件比首选项日期新。现在!我知道这不是比较日期的最佳方法,但它对于我想做的事情来说是有效的。

我遇到的问题是确定来自loopj的所有后台http调用都已完成,以便我现在可以在列表对话框或我选择的任何ui元素中显示数组列表的结果。我尝试循环遍历数组列表,但由于loopj/http连接是后台线程,因此循环会在所有连接完成之前执行,因此显示一个空的或未填充的完整数组。

我可以编写一个 if 条件来确定 Loopj 是否尚未完成所有连接的执行以及何时执行我的 ui 代码?

最佳答案

以下代码应该可以解决您的问题:

类文件:UploadRunner.java

public class UploadRunner extends AsyncHttpResponseHandler implements Runnable {

  private final AsyncHttpClient client;
  private final ArrayList<String> filesList;
  private final int filesCount;
  private final Handler handler;

  private String baseURI;
  private boolean isFired;
  private int filesCounter;

  // Use in case you have no AHC ready beforehand.
  public UploadRunner(ArrayList<String> filesList) {
    this(new AsyncHttpClient(), filesList);
  }

  public UploadRunner(
    AsyncHttpClient client, 
    ArrayList<String> filesList, 
    Handler handler
  ) {
    assert null != client;
    assert null != filesList;
    assert null != handler;

    this.client = client;
    this.filesList = filesList;
    this.handler = handler;

    this.baseURI = "";
    this.filesCount = filesList.size();
    this.filesCounter = 0;
  }

  public String getBaseURI() {
    return baseURI;
  }

  public void setBaseURI(String uri) {
    baseURI = uri;
  }

  @Override
  public void run() {
    // Request to download all files.
    for(final String file : filesList) {
      client.get(baseURI + file, this);
    }
  }

  @Override
  public void onSuccess(int statusCode, Header[] headers, byte[] response) {
    // This shouldn't happen really...
    if(isFired) {
      return;
    }

    // One more file downloaded.
    filesCounter++;

    // If all files downloaded, fire the callback.
    if(filesCounter >= filesCount) {
      isFired = true;
      handler.onFinish(getLastModificationDate(headers));
    }
  }

  private String getLastModificationDate(Header[] headers) {
    // Simple mechanism to get the date, but maybe a proper one
    // should be implemented.
    return headers[3].getValue();
  }

  public static interface Handler {

    public void onFinish(String lastModificationDate);

    // TODO: Add onError() maybe?
  }
}

在这种情况下,您将上传机制封装在一处,并仅公开一个接口(interface),用于在所有文件上传时回调处理程序。

典型用例:

// TODO: This typically should run in a different thread.
public class MyTask implements UploadRunner.Handler, Runnable {

  private final static BASE_URI = "http://www.example.com/";

  private final AsyncHttpClient client = new AsyncHttpClient();
  private final ArrayList<String> filesList = new ArrayList<>();

  @Override
  public void run() {
    filesList.add("1.png");
    filesList.add("2.png");
    filesList.add("3.png");
    filesList.add("4.png");
    filesList.add("5.png");

    // Create a new runner.
    UploadRunner ur = new UploadRunner(client, filesList, this);

    // Set base URI.
    ur.setBaseURI(BASE_URI);

    // Spring the runner to life.
    ur.run();
  }

  @Override
  public void onFinish(String lastModificationDate) {
    // All files downloaded, and last modification date is supplied to us.
  }
}

关于java - 确定 LoopJ 何时结束所有后台连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112105/

相关文章:

java - 如果 jar 已经在运行,则阻止它运行?

java - 在 Java 中,我应该使用什么来实现首先返回最大元素的 PriorityQueue?

android - 使用ViewPager时如何处理savedInstanceState?

Java Random,种子的微小变化只会导致输出的微小变化

android - Android 上的 Ruby 处理

java - 使用 write() 方法,文件变得太大

arrays - 字符串数组到 Int8 数组字节类型转换

javascript - 如何使用 Parse.com/Express JS 检索对象信息并将其添加到数组中

javascript - JS中比较数组个数

java - Android Recyclerview 不显示任何数据