如何在返回布尔值之前先等待改进响应

时间:2017-03-09 10:24:10

标签: android multithreading boolean retrofit fragmentpageradapter

在请求完成之前始终返回错误的值。验证将返回值而不等待响应。我正在使用改装请求然后我把它放在听众身上。

谢谢你的帮助,建议很受欢迎!

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

@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);
                }
            });
}

1 个答案:

答案 0 :(得分:0)

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

该方法将执行Thread,但是当该Thread正在执行时,将读取其余代码,这意味着将读取return pass.get();return false;个参数,从而导致该方法在服务器响应之前返回。

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