为了账号安全,请及时绑定邮箱和手机立即绑定

需要多线程处理一个单一的请求并等待应答

需要多线程处理一个单一的请求并等待应答

当年话下 2022-06-04 09:15:40
我在多线程问题上有点挣扎。我需要通过 发送请求sendRESTRequest(jsonRequest),但我不想阻塞 UI 线程,所以maskerPane.setVisible会被执行。我可以使用 JavaFX Task,但是我必须currentValueLabel.setText在那个线程中编写我的(等)。但是因为我正在重用该sendRESTRequest(jsonRequest)方法,所以我会用很多无用的行来破坏我的代码。是否可以sendRESTRequest在另一个线程上执行,等待结果Unirest.post并使用返回HttpResponse jsonResponse的进行进一步处理?目前我正在使用这段代码:@FXMLprotected void searchButtonAction() {    maskerPane.setVisible(true);    cardNumber = cardNumberTextField.getText();    JSONObject jsonRequest = new JSONObject()    .put("id", cardNumber)    .put("trans", 20);            //            // How to put this asynchronus, but wait for the answer before continuing to System.out.println(loyaltyResponse.toString());            //    JSONObject loyaltyResponse = sendRESTRequest(jsonRequest);            //            //            //    System.out.println(loyaltyResponse.toString());    currentValueLabel.setText(loyaltyResponse.getString("amount").replace(".", ",") + " Currency");    maximumValueLabel.setText(loyaltyResponse.getString("balanceMax").replace(".", ",") + " Currency");    maskerPane.setVisible(false);}private JSONObject sendRESTRequest(JSONObject jsonRequest) {    HttpResponse<JsonNode> jsonResponse = null;    try {        jsonResponse = Unirest.post("http://myurl/")        .header("accept", "application/json")        .body(jsonRequest)        .asJson();    } catch (UnirestException e) {        e.printStackTrace();    }    return jsonResponse.getBody().getObject();}谢谢你的帮助!
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

现在我通过


@FXML

protected void searchButtonAction() {

    maskerPane.setVisible(true);


    cardNumber = cardNumberTextField.getText();


    JSONObject jsonRequest = new JSONObject()

    .put("id", cardNumber)

    .put("trans", 20);

    Task<JSONObject> jsonRequestTask = new Task<JSONObject>() {

        @Override

        public JSONObject call() {

            return sendRESTRequest(jsonRequest);

        }

    };


    jsonRequestTask.setOnSucceeded(event -> {

        JSONObject loyaltyResponse = jsonRequestTask.getValue();


        currentValueLabel.setText(loyaltyResponse.getString("amount").replace(".", ",") + " Currency");

        maximumValueLabel.setText(loyaltyResponse.getString("balanceMax").replace(".", ",") + " Currency");


        maskerPane.setVisible(false);

    }


    jsonRequestTask.setOnFailed(event -> {

        maskerPane.setVisible(false);

    });


    new Thread(jsonRequestTask).start();

}


private JSONObject sendRESTRequest(JSONObject jsonRequest) {

    HttpResponse<JsonNode> jsonResponse = null;

    try {

        jsonResponse = Unirest.post("http://myurl/")

        .header("accept", "application/json")

        .body(jsonRequest)

        .asJson();

    } catch (UnirestException e) {

        e.printStackTrace();

    }


    return jsonResponse.getBody().getObject();

}

工作正常。谢谢你的帮助。


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信