Java 如何使用Callable以便可以从网络调用(HTTP Post)返回结果并在其他方法中使用
我试图理解如何将响应消息中的“uuid”值从HTTP Post传递到代码中的后续点。postRequest工作正常(我的测试使用了一个名为“item_success_id”的文本框,在这里我可以看到新创建的“uuid”,但是我需要使用这个“uuid”为我的okHttpHandler构建一个新的端点来上传一个与“uuid”关联的图像 问题是run()方法无法返回任何内容,因此我认为需要使用Callable,但我不知道如何正确使用它 此外,还有一个约束条件,myResponse不能被调用两次。API希望客户端捕获响应并在需要时缓存它自己。这就是我需要能够做到的。我认为从可运行方法转变为可调用方法不应该是一个巨大的变化,但似乎是这样。感谢您提供的任何帮助提供Java 如何使用Callable以便可以从网络调用(HTTP Post)返回结果并在其他方法中使用,java,return-value,okhttp,callable,android-runonuithread,Java,Return Value,Okhttp,Callable,Android Runonuithread,我试图理解如何将响应消息中的“uuid”值从HTTP Post传递到代码中的后续点。postRequest工作正常(我的测试使用了一个名为“item_success_id”的文本框,在这里我可以看到新创建的“uuid”,但是我需要使用这个“uuid”为我的okHttpHandler构建一个新的端点来上传一个与“uuid”关联的图像 问题是run()方法无法返回任何内容,因此我认为需要使用Callable,但我不知道如何正确使用它 此外,还有一个约束条件,myResponse不能被调用两次。API
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_create_item_image:
try {
postRequest(createItemEndpoint, createItemBody);
OkHttpHandler okHttpHandler = new OkHttpHandler();
okHttpHandler.execute(createImageEndpoint);
} catch (IOException e) {
e.printStackTrace();
}
break;
void postRequest (String postUrl, String postBody) throws IOException {
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON, postBody);
Request request = new Request.Builder()
.url(postUrl)
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String myResponse = response.body().string();
PicActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
JSONObject json = new JSONObject(myResponse);
item_success_id.setText("Item UUID: " + json.getString("uuid"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
});
}
您可以保持该程序的可运行性。您需要使用的是侦听器模式构造,它可以按如下方式实现: 首先,定义侦听器接口,例如:
private interface OnUuidListener {
void onUuidReady(String uuid);
}
在保存代码的方法中,您可能需要添加一个参数,例如:
postRequest(..., final OnUuidListener listener) {
// Your code is here
}
您将使用从网络获得的UUID调用侦听器,该UUID将提供您的结果:
String uuid = json.getString("uuid");
listener.onUuidReady(uuid);
最后,要使用您的方法,您必须以匿名方式传递侦听器接口的实例:
postRequest(..., new OnUuidListener() {
@Override
public void onUuidReady(String uuid) {
// A subsequent point in your code.
item_success_id.setText("Item UUID: " + uuid);
}
});
谢谢大家的帮助,但我无法准确地理解如何使用您的输入。我无法正确地实现接口。因此,由于我意识到我实际上不需要对活动中的变量做任何事情,所以我消除了runonuithread代码,然后我还意识到我可以在我使用uuid的地方使用uuid设置它,然后将我的整个OkHttpHandler代码移到我的postRequest方法中,这样它就可以立即访问它。无需保存它并保留它。实际上,侦听器应该被传递回UI线程,因此不完全需要Runnable