【问题标题】:How to wait first for the retrofit response before returning the boolean如何在返回布尔值之前先等待改造响应
【发布时间】:2017-07-30 06:49:11
【问题描述】:

在请求完成之前总是返回错误的值。验证将已经返回值而无需等待响应。我正在使用改造请求然后我把它放在监听器上。

感谢您的帮助,建议已被采纳!

这是我的代码,我对屏幕进行了验证,如果它是真的,它将转到另一个屏幕。

@Override
public boolean isValid() {
    if (NetworkUtils.isConnected(getActivity())) {
        final AtomicBoolean pass = new AtomicBoolean(false);
        Thread simpleThread = new Thread() {
            public void run() {
                new ReprintOnlineHelper(rType, receiptNoEditText.getText().toString(), issuedDate, etTotalAmtPaid.getText().toString(), new ReprintOnlineHelper.ReceiptNoSearchListener() {
            @Override
            public boolean onServiceResponse(List<ReceiptNumber> receiptNumbers) {
                Log.e("receiptNumbers", "" + receiptNumbers.get(0).getTPAYRECEIPTNO());

                if (receiptNumbers.isEmpty()) {
                    returnValue = "eReceipt Number not found!";
                    val = true;
                } else {
                    String pdates = null, ddates;
                    try {
                        if (!receiptNumbers.get(0).getTPAYISSUEDDATE().isEmpty()) {
                            Date periodFormat = df.parse(receiptNumbers.get(0).getTPAYISSUEDDATE());
                            pdates = sdf.format(periodFormat);
                        }

                    } catch (ParseException e) {
                        e.printStackTrace();
                        Log.e("ddd", "" + e.getMessage());
                    }

                    String tinNo = receiptNumbers.get(0).getTPTIN();
                    if (tinNo.contains("-")) {
                        tinNo = receiptNumbers.get(0).getTPTIN().replace("-", "");
                    }

                    Log.e("JAC", "" + receiptNumbers.get(0).getTPAYRECEIPTNO() + "---" + AlfonzoUtils.formatDate(DateUtils.simpledateToMillis(pdates, DateUtils.DateFormat.SIMPLE_DATE_5_FORMAT)) + "---" + MoneyEditText.toDouble(receiptNumbers.get(0).getTOTALPAID()) + "--" + AlfonzoUtils.formatDate(issuedDate) + "--" + receiptNoEditText.getText().toString() + "--" + tinNo + "--"+revenueCollection.getTpTin().replace("-", ""));

                    if (receiptNumbers.get(0).getTPAYRECEIPTNO().equals(receiptNoEditText.getText().toString()) &&
                            AlfonzoUtils.formatDate(DateUtils.simpledateToMillis(pdates, DateUtils.DateFormat.SIMPLE_DATE_5_FORMAT)).contentEquals(AlfonzoUtils.formatDate(issuedDate))
                            && MoneyEditText.toDouble(receiptNumbers.get(0).getTOTALPAID()) == MoneyEditText2.toDouble(etTotalAmtPaid.getText().toString()) && tinNo.equals(revenueCollection.getTpTin().replace("-", ""))) {
                        pass.set(true);
                        returnValue = "success";
                        val = true;
                        showMessagePrompt(rType,returnValue);
                        return true;
                    } else if (!tinNo.equals(revenueCollection.getTpTin().replace("-", ""))) {
                        returnValue = "eReceipt Number was not issued to this TIN " + revenueCollection.getTpTin();
                        val = false;
                    } else if (!AlfonzoUtils.formatDate(DateUtils.simpledateToMillis(pdates, DateUtils.DateFormat.SIMPLE_DATE_5_FORMAT)).contentEquals(AlfonzoUtils.formatDate(issuedDate))) {
                        returnValue = "Issued date is not valid";
                        val = false;
                    } else if (MoneyEditText.toDouble(receiptNumbers.get(0).getTOTALPAID()) != MoneyEditText2.toDouble(etTotalAmtPaid.getText().toString())) {
                        returnValue = "Total amount paid is not valid";
                        val = false;
                    } else if (!receiptNumbers.get(0).getTPAYRECEIPTNO().equals(receiptNoEditText.getText().toString())) {
                        returnValue = "ReceiptNo is not valid";
                        val = false;
                    }
                }
                return false;
            }

            @Override
            public void onErrorResponse(int err) {

            }
        }).reprintReceiptNo();

            }
        };

        if (!receiptNoEditText.getText().toString().isEmpty() && issuedDate != 0 /*&& MoneyEditText2.toDouble(etTotalAmtPaid.getText().toString()) > 0*/) {
            try {
                simpleThread.start();
                simpleThread.join();
                pass.get();


                Log.e("pass", "" + pass + "-" + pass.get() + val);


            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return pass.get();
        }


    }

    return false;
}

这是我的改造要求:

   public void reprintReceiptNo() {
    JSONObject jO = new JSONObject();
    JSONObject result = new JSONObject();
    JSONArray jsonArray = new JSONArray();
    try {
        jO.put("xReceipt", receiptTypeNo);
        jO.put("xType", receipttype);
        jsonArray.put(jO);
        result.put("dataArray", jsonArray);

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Log.e("dataArray", "----- " + result.toString());

    ServiceInterface si = BaseRestClient.getClient();
    Observable<List<ReceiptNumber>> call = si.getreprintReceiptNumber(result.toString());
    call.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<ReceiptNumber>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(List<ReceiptNumber> receiptNumbers) {
                    Log.e("receiptNumbers", "" + receiptNumbers.toString());
                    onReceiptNoSearchListener.onServiceResponse(receiptNumbers);
                }
            });
}

【问题讨论】:

    标签: android multithreading boolean retrofit fragmentpageradapter


    【解决方案1】:

    如果您在创建的线程之外有代码,isValid() 方法不可能等待服务响应。

    该方法将执行线程,但是当线程正在执行时,将读取其余代码,这意味着将读取return pass.get();return false; 语句,导致该方法在服务器之前返回回应。

    解决方案是改变这样做的方式。您应该检查您是否可以调用服务器,然后根据您想要继续的方式在方法 onServiceResponse()onErrorResponse() 中创建您的逻辑。

    【讨论】:

    • 您有什么建议吗?
    猜你喜欢
    • 2021-08-02
    • 2019-02-20
    • 1970-01-01
    • 2022-12-20
    • 2020-04-20
    • 2020-04-17
    • 1970-01-01
    • 2017-10-12
    • 2014-11-26
    相关资源
    最近更新 更多