如何使用 Callable return 网络调用 (HTTP Post) 的结果并在另一种方法中使用
how to use Callable so can return a result from a network call (HTTP Post) and use in another method
我试图了解如何将在来自 HTTP Post 的响应消息中找到的 "uuid" 值传递到我的代码中的后续点。 postRequest 正常工作(我的测试使用了一个名为 "item_success_id" 的文本框,我可以在其中看到新创建的 "uuid",但是我需要使用那个 "uuid" 为我的 okHttpHandler 构建新端点以上传图像以与 "uuid" 关联。
问题是 运行() 方法不能 return 任何东西所以我想我需要改用 Callable,但我可以弄清楚如何正确使用它。
此外,还有一个约束条件是 myResponse 不能被调用两次。 API 期望客户端捕获响应并在需要时自行缓存。这就是我需要能够做到的。我不认为从 运行nable 方法转变为可调用方法应该是一个巨大的变化,但它似乎是。感谢您提供的任何帮助。
@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();
}
}
});
}
});
}
你可以保留Runnable。您需要使用的是一个侦听器模式构造,可以按如下方式实现:
首先,定义你的监听接口,例如:
private interface OnUuidListener {
void onUuidReady(String uuid);
}
在包含代码的方法中,您可能需要添加一个参数,例如:
postRequest(..., final OnUuidListener listener) {
// Your code is here
}
您将使用从网络获得的 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);
}
});
感谢大家的帮助,但我无法弄清楚如何使用您的输入。我无法正确实现接口。所以,因为我意识到我实际上不需要对 activity 中的变量做任何事情,所以我删除了 runonuithread 代码,然后我也意识到我可以只在我得到它的地方使用 uuid 等等只是将我的整个 OkHttpHandler 代码移动到我的 postRequest 方法中,这样它就可以立即访问它。无需保存和保留。
我试图了解如何将在来自 HTTP Post 的响应消息中找到的 "uuid" 值传递到我的代码中的后续点。 postRequest 正常工作(我的测试使用了一个名为 "item_success_id" 的文本框,我可以在其中看到新创建的 "uuid",但是我需要使用那个 "uuid" 为我的 okHttpHandler 构建新端点以上传图像以与 "uuid" 关联。
问题是 运行() 方法不能 return 任何东西所以我想我需要改用 Callable,但我可以弄清楚如何正确使用它。
此外,还有一个约束条件是 myResponse 不能被调用两次。 API 期望客户端捕获响应并在需要时自行缓存。这就是我需要能够做到的。我不认为从 运行nable 方法转变为可调用方法应该是一个巨大的变化,但它似乎是。感谢您提供的任何帮助。
@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();
}
}
});
}
});
}
你可以保留Runnable。您需要使用的是一个侦听器模式构造,可以按如下方式实现:
首先,定义你的监听接口,例如:
private interface OnUuidListener {
void onUuidReady(String uuid);
}
在包含代码的方法中,您可能需要添加一个参数,例如:
postRequest(..., final OnUuidListener listener) {
// Your code is here
}
您将使用从网络获得的 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);
}
});
感谢大家的帮助,但我无法弄清楚如何使用您的输入。我无法正确实现接口。所以,因为我意识到我实际上不需要对 activity 中的变量做任何事情,所以我删除了 runonuithread 代码,然后我也意识到我可以只在我得到它的地方使用 uuid 等等只是将我的整个 OkHttpHandler 代码移动到我的 postRequest 方法中,这样它就可以立即访问它。无需保存和保留。