非 void 方法中的异步
Asynchronous within non-void method
我正在使用 Android loopj 库来实现异步 HTTP 客户端。我需要将 responseBody
设置为图像对象的 属性,如下所示,但由于异步,return 语句将改为 运行,并且图像对象始终为 null。
public Image uploadImage(boolean async) {
Image image = new Image();
HttpClient.post(getFinalUrl(async), makeRequestParams(), new AsyncHttpResponseHandler
() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
UploadResponse[] uploadResponses = GsonParser.getArrayFromGson(responseBody,
UploadResponse[].class);
UploadResponse response = uploadResponses[0];
String st = response.getContent();
image.setImageAddress(st);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.d("injaro", error.getMessage());
}
});
}
异步方法不能这样工作。您应该向他们传递一个回调对象,一旦响应可用,该对象就会被调用。
所以如果你像这样定义一个回调接口:
public interface ImageCallback {
void onImageReceived(Image image);
}
然后您可以像这样创建 2 个方法(一个同步方法和一个异步方法):
public Image uploadImage() {
...
}
public void uploadImageAsync(ImageCallback callback) {
...
}
在这一点上你只需要调用你需要的方法 - 即按钮点击侦听器会调用异步方法(因为你不想阻塞 UI 线程),但是你的后台服务可以安全调用同步服务。
我正在使用 Android loopj 库来实现异步 HTTP 客户端。我需要将 responseBody
设置为图像对象的 属性,如下所示,但由于异步,return 语句将改为 运行,并且图像对象始终为 null。
public Image uploadImage(boolean async) {
Image image = new Image();
HttpClient.post(getFinalUrl(async), makeRequestParams(), new AsyncHttpResponseHandler
() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
UploadResponse[] uploadResponses = GsonParser.getArrayFromGson(responseBody,
UploadResponse[].class);
UploadResponse response = uploadResponses[0];
String st = response.getContent();
image.setImageAddress(st);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.d("injaro", error.getMessage());
}
});
}
异步方法不能这样工作。您应该向他们传递一个回调对象,一旦响应可用,该对象就会被调用。
所以如果你像这样定义一个回调接口:
public interface ImageCallback {
void onImageReceived(Image image);
}
然后您可以像这样创建 2 个方法(一个同步方法和一个异步方法):
public Image uploadImage() {
...
}
public void uploadImageAsync(ImageCallback callback) {
...
}
在这一点上你只需要调用你需要的方法 - 即按钮点击侦听器会调用异步方法(因为你不想阻塞 UI 线程),但是你的后台服务可以安全调用同步服务。