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

问题描述 投票:0回答:2

我试图了解如何将响应消息中找到的“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();
                    }
                }
            });
        }
    });
}
java return-value okhttp callable android-runonuithread
2个回答
1
投票

你可以保留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);
        }
    });

0
投票

感谢帮助人员,但我无法弄清楚如何使用您的输入。我无法正确实现接口。所以,因为我意识到我实际上不需要对活动中的变量做任何事情我消除了runonuithread代码,然后我也意识到我可以在我得到它的地方使用uuid所以只是移动了我的整个OkHttpHandler代码到我的postRequest方法里面,所以它可以立即访问它。无需保存并保留任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.