2016-12-12 15 views
1

私はオブジェクトを返すべきであるが、解析(connectionRequest,とpostresponse)を使用すると、常にnull値が返されるという単純な方法では苦労しています。私のコードコードネーム1の構文解析

Paiement P = new PaiementDAO().FindByCardNumber("5300721124642197"); 
System.out.println("hi "+P.getCardHolderName()); 

例出力は常に間違って何findby方法を入力後、最初のsystem.out.printlnを実行していますか?あなたの実行順序の仮定が正しければ

これは私の完全なコード

`  public Paiement FindByCardNumber(String CardNumber) { 
Paiement P = new Paiement(); 
     ConnectionRequest connectionRequest; 
     connectionRequest = new ConnectionRequest() { 
      List<Paiement> colors = new ArrayList<>(); 

      @Override 
      protected void readResponse(InputStream input) throws IOException { 
       System.out.println("hi read response"); 
       JSONParser json = new JSONParser(); 
       try { 
        Reader reader = new InputStreamReader(input, "UTF-8"); 

        Map<String, Object> data = json.parseJSON(reader); 

        List<Map<String, Object>> content 
          = (List<Map<String, Object>>) data.get("root"); 
        colors.clear(); 
        for (Map<String, Object> obj : content) { 
         colors.add(
           new Paiement((String) obj.get("cardholdername"), (String) obj.get("cardnumber"), (String) obj.get("expirationdate"), (String) obj.get("securitycode"), (String) obj.get("type"), Float.parseFloat((String) obj.get("solde")))); 
        } 
       } catch (IOException err) { 
       } 
      } 

      @Override 
      protected void postResponse() { 
       System.out.println("hi post response"); 

       for (Paiement x : colors) { 
        P = x; 
        System.out.println(P); 
    return; 
       } 
      } 

     };enter code here 
     connectionRequest.setUrl("http://localhost/payement/findbynumber.php?num=" + CardNumber); 
     NetworkManager.getInstance().addToQueue(connectionRequest); 
    return P;` 
+0

このような例外を捕まえてはいけません。ロギングなしでエラーを飲み込んでいる可能性が非常に高いです。私は、応答の最初の行にブレークポイントを置き、コードをステップ実行することをお勧めします。あなたは価値を取り戻しますか?それは何が問題なのかはっきりしていませんが、変数を調べることで簡単に見ることができます。 –

+0

私はいくつかの値(system.out.println)を追加したいのですが、このコードが実行されると、これらの行は次のとおりです。 {connectionRequest.setUrl( "http://localhost/payement/findbynumber.php?num =" + CardNumber); NetworkManager.getInstance()。addToQueue(connectionRequest); return P; '} –

+0

OK、あなたの質問はそれではっきりしませんでした。 'addToQueue'は非同期です。 'addToQueueAndWait()'で置き換えることができます。 –

答えて

1

この行が見つからないことがありますか?

connectionRequest.setPost(false); 

私は確信していませんが、デフォルトではtrueに設定されています。

+0

同じことがうまくいきませんでした –

+0

問題を解決していない可能性がありますが、@ Carlsが正しいです...取得リクエストがあります。 –

1

ある - DAO.FindByCardNumberは怠惰なオブジェクトまたは将来の代わりに見つかったものを返すと、実際のfindbyかもしれないPアクセスの瞬間に、または別のスレッドで実行されます。

あなたがSystem.out.printlnP.getCardHolderName()を呼び出すと、実際の実行順序をトレースする必要があることを確認するには、(DAO.FindBy*で、またはP.getCardHolderName()で初期化Pフィールドであります?)。

UPDATE:

はい、あなたのDAOは非同期であり、実際の検索は、メインスレッドと並列に実行されます。したがって、System.out.printlnは早期に開始され、DAO要求の完了を待たなければなりません。

+0

はい、DAO.findByでPを初期化しましたが、System.out.println()を実行してDAO.findByを実行するように常に実行しています。 –

+0

パブリックPaiement FindByCardNumber(String CardNumber){ Paiement P = new Paiement(); ConnectionRequest connectionRequest; connectionRequest = new ConnectionRequest(){ リスト colors = new ArrayList <>(); @Override protected void readResponse(InputStream input)throws IOException { System.out.println( "hi read response"); JSONParser json = new JSONParser(); { リーダーリーダー=新しいInputStreamReader(入力、 "UTF-8"); –

+0

Map data = json。parseJSON(リーダー); List >コンテンツ =(List >)data.get( "root"); colors.clear();for(Map obj:content){ colors.add( 新しいPaiement((String)obj.get( "cardholdername")、(String)obj.get( "cardnumber")、(String) obj.get( "タイプ")、Float.parseFloat((String)obj.get( "solde"))) ); } –