2016-11-27 22 views
0

私は完全に機能しherokuにデプロイされているフラスコRESTFUL APIを持っています。私は今、私のアンドロイドアプリからリクエストを受ける必要があります。私はこれを行うためにライブラリを使用しています。ここでアンドロイドクライアントからAPIへの呼び出しに失敗しました

は、AndroidクライアントにJSON配列を返すURL https://thecaffapi.herokuapp.com/api/v1/all_stock、でAPIへの呼び出しを行うコードです:

client.get(baseurl + "all_stock", null, new JsonHttpResponseHandler() { 
     @Override 
     public void onSuccess(int statusCode, Header[] headers, JSONArray allStock) { 
      for (int i = 0; i < allStock.length(); i++) { 
       try { 
        JSONObject stockObject = allStock.getJSONObject(i); 
        int id = stockObject.getInt("id"); 
        String stockTitle = stockObject.getString("stock_title"); 
        int stockNumber = stockObject.getInt("stock_number"); 
        Stock stock = new Stock(id, stockTitle, stockNumber); 
        mStockList.add(stock); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 

ラインclient.get(baseurl + "all_stock", null, new JsonHttpResponseHandler() {が実行され、しかしするonSuccess()メソッドはありません走りません。アプリは、コンソールのレポートを実行している

次AsyncHttpClientに関連:

V/AsyncHttpRH: Progress 216 from 216 (100%) 
W/JsonHttpRH: onSuccess(int, Header[], JSONObject) was not overriden, but callback was received 

はなぜするonSuccess()メソッドをオーバーライドし、その結果実行されていないのですか?

onSuccess(int statusCode, Header[] headers, JSONArray allStock) 

あなたのAPIはあなたを与える:事前に

おかげで、

トム

答えて

1

onSucessメソッドの3番目の要素は、応答を解析するオブジェクトです。あなたの応答は配列形式ではなく、値が配列である単一の名前の値のペアを持ちます。したがって、代わりにJSONObjectを使用して配列を取得する必要があります。

client.get(baseurl + "all_stock", null, new JsonHttpResponseHandler() { 
    @Override 
    public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
     JSONArray allStock = response.getJSONArray("stock"); 
     for (int i = 0; i < allStock.length(); i++) { 
      try { 
       JSONObject stockObject = allStock.getJSONObject(i); 
       int id = stockObject.getInt("id"); 
       String stockTitle = stockObject.getString("stock_title"); 
       int stockNumber = stockObject.getInt("stock_number"); 
       Stock stock = new Stock(id, stockTitle, stockNumber); 
       mStockList.add(stock); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}); 
+0

これは、ループ内の 'mStockList'の内容は正しいデータを保持しています。しかし、このブロックの外に 'mStockList'の内容を返すと、それは空です。 –

+0

これは非同期呼び出しで、onSucessメソッドは別のスレッドで実行され、他のステートメントはUIスレッド内にあるため、呼び出しが実行されたときにデータはロードされません。 – rhari

+0

おかげで、人生節約のもの。 –

0

は、あなたが正確なメソッドをオーバーライドする

onSuccess(int, Header[], JSONObject), 

を持っているように、あなたは少し違って見えるようですJSONObjectであり、JSONArrayではありません。

+0

質問に記載されているURLに行ったことがありますか?オブジェクトではなくJSON配列で応答するis isはありません。 @ ascorbin –

+0

提案に変更した場合、コンソールで次の出力が表示されます:onSuccess(int、Header []、JSONObject)はそうではありませんでした。オーバーライドされましたが、コールバックが受信されました 11-27 22:08:05.409 27015-27015/com.neutronstar.thecaffapi W/System.err:org.json.JSONException:IDの値がありません。 ' –

関連する問題