0

之前先等待加裝響應,然後再返回錯誤的值,然後才能完成請求。驗證將已經返回值而不用等待響應。我正在使用改造的請求,然後我把它放在監聽器上。如何在返回布爾型

謝謝你的幫助,建議很多人接受!

這是我的代碼,我有驗證的屏幕,當它是真的,它會去另一個屏幕。

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

回答

0

它不可能爲isValid()方法等待服務效應初探如果你有你所創建的線程之外的代碼。

的方法將執行的線程,但而線程執行,代碼的其餘部分將被讀取,這意味着return pass.get();return false;的語句將被讀取,導致該方法在服務器響應之前返回。

其改變這種做法的解決方案。您應該檢查是否可以調用服務器,然後根據您想要繼續的方式,使用方法onServiceResponse()onErrorResponse()創建邏輯。

+0

你有什麼建議嗎? –