【问题标题】:Android AsyncHttpClient call wait for finishingAndroid AsyncHttpClient 调用等待完成
【发布时间】:2015-10-03 14:51:16
【问题描述】:

在我的 Android 应用程序中,我有时会进行同步 HTTP 调用。由于这在主 UI 线程中是不可能的,因此我试图通过使用 com.loopj.android.http.AsyncHttpClient 和处理程序来规避问题。在我的代码中,我尝试等待调用完成:

public class someclass {
...
//asynchronous HTTP handler for Android
private static AsyncHttpClient httpClient = new AsyncHttpClient(); 
...
public void somemethod() {
...
httpClient.get(request, handler);
    ...
    //waiting for call to be finished
    do {
        Thread.sleep(100); //for testing only
        log.info("sleeping...");
    } while (!handler.isFinished());


    response = handler.getBody();
    log.info("Async resp = " + response);
 ...

我编写了自己的处理程序类:

    public class MyAsyncHTTPResponseHandler extends AsyncHttpResponseHandler {



    private String header = null;
    private String body = null;
    private int status = 0;
    boolean finish = false;

    public MyAsyncHTTPResponseHandler() {
        super();
        log.info("init Http handler ");
        finish = false;
    }

    @Override
    public void onStart() {
        // called before request is started
        log.info("starting Async Get");
        finish = false;
    }

    @Override
    public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {


        body = new String(responseBody);
        status = statusCode;
        finish = true;

        log.info("Async Get worked fine " + responseBody);
    }



    @Override
    public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, java.lang.Throwable error) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
        log.info("Error in executing URL get " + statusCode + " " + responseBody);
        finish = true;
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }

    public String getBody() {
        return body;
    }

    public int getStatusCode() {
        return status;
    }

    public boolean isFinished() {
        return finish;
    }

}

不幸的是,这不起作用。 onStart() 方法将被执行,但循环将永远运行。不会调用onSuccess() 方法。

如果我注释掉循环,正文响应将为空。正如我在这种情况下的日志中看到的那样,onSuccess() 方法将被调用,但在我在somemethod() 中的日志语句之后。

我在这里做错了什么?

【问题讨论】:

    标签: java android multithreading user-interface http


    【解决方案1】:

    最简单的解决方案是将volatile关键字添加到变量finish。 或者使用同步:

    public synchronized void setFinish()
       {
           finish = True;
       }
    
       public synchronized boolean isFinished()
       {
           return finish;
       }
    

    【讨论】:

    • 对不起,对我不起作用(既不可变也不同步)。将调用 init 方法,但不会调用成功方法...
    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多