代码之家  ›  专栏  ›  技术社区  ›  Kent Lauridsen

如何使用Callable以便可以从网络调用(HTTP Post)返回结果并在其他方法中使用

  •  0
  • Kent Lauridsen  · 技术社区  · 6 年前

    我试图理解如何将响应消息中的“uuid”值从HTTP Post传递到代码中的后续点。这个 postRequest 正常工作(我的测试使用一个名为“item\u success\u id”的文本框,在这里我可以看到新创建的“uuid”,但是我需要在为我的 okHttpHandler 上载图像以与“uuid”关联。

    问题是 运行() 方法无法返回任何内容,所以我认为需要使用Callable,但我不知道如何正确使用它。

    此外,还有一个约束条件 我的回应 无法调用两次。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();
                        }
                    }
                });
            }
        });
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   OneCricketeer    6 年前

    你可以让它继续运行。您需要使用的是侦听器模式构造,它可以按照以下方式实现:

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

    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);
            }
        });
    
        2
  •  0
  •   Kent Lauridsen    6 年前

    谢谢大家的帮助,但我不知道如何使用你的输入。我无法正确实现接口。因此,由于我意识到我实际上不需要对活动中的变量做任何事情,我消除了runonuithread代码,然后我还意识到我可以在获取uuid的地方使用uuid,所以只需将整个OkHttpHandler代码移到postRequest方法中,这样它就可以立即访问它。不需要保存它,也不需要为任何事情保留它。