java - 如何使用 Callable 以便可以从网络调用(HTTP Post)返回结果并在另一个方法中使用

标签 java return-value okhttp callable android-runonuithread

我试图了解如何将响应消息中找到的“uuid”值从 HTTP Post 传递到代码中的后续点。 postRequest 工作正常(我的测试使用名为“item_success_id”的文本框,我可以在其中看到新创建的“uuid”,但随后我需要使用该“uuid”为我的 < strong>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();
                    }
                }
            });
        }
    });
}

最佳答案

您可以保留 Runnable。您需要使用的是监听器模式构造,可以按如下方式实现:

首先,定义监听器接口(interface),例如:

private interface OnUuidListener {
    void onUuidReady(String uuid);
}

在保存代码的方法中,您可能需要添加一个参数,例如:

postRequest(..., final OnUuidListener listener) {
    // Your code is here
}

您将使用从网络获得的 UUID 调用监听器,这将传递您的结果:

String uuid = json.getString("uuid");
listener.onUuidReady(uuid);

最后,要使用您的方法,您必须传递监听器接口(interface)的实例,通常以匿名方式:

postRequest(..., new OnUuidListener() {
        @Override
        public void onUuidReady(String uuid) {
            // A subsequent point in your code.
           item_success_id.setText("Item UUID: " + uuid);
        }
    });

关于java - 如何使用 Callable 以便可以从网络调用(HTTP Post)返回结果并在另一个方法中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915967/

相关文章:

gometalinter/errcheck 在延迟返回变量的函数时返回警告

java - 如何从 okhttp3.ResponseBody 获取 url?

java - 在 mysql java 中循环 - 搜索模板

c++ - 函数返回临时对象行为不当

java - Glassfish 中的 ThreadLocal 内存泄漏

java - 如果失败,从 Makefile 调用的 jar 的返回值应该是什么?

android - 如何提高okhttp3冷启动时的性能

Android Retrofit 日志不显示

java - 为什么在执行 XSLT 转换时会出现 "Premature End of File"错误?

java - 如何使用 pdfbox 将 unicode 文本写入 pdf?