2017-08-31 9 views
0

JSONの形式でUbidotsの配列から最新の値を取得しようとしています。配列から最新の値を取得してTextViewに表示したい。 JSONのコードはここにあります。私はListを使用しています。なぜなら、JSON全体をグラフに入れるからです。今、問題は全体の結果から最新の値が1つしか得られません。Android - 配列から最新の値を取得してTextViewに表示

public class UbidotsClient { 
private UbiListener listener; 

public UbiListener getListener() { 
    return listener; 
} 

public void setListener(UbiListener listener) { 
    this.listener = listener; 
} 

public void handleUbidots(String Datasource ,String varId, String apiKey, final UbiListener listener) { 

    final List<Value> results = new ArrayList<>(); 

    OkHttpClient client = new OkHttpClient(); 
    Request req = new Request.Builder().addHeader("X-Auth-Token", apiKey) 
      .url("http://things.ubidots.com/api/v1.6/devices/" + Datasource + "/" + varId + "/values/?page_size=100") 
      .build(); 

    client.newCall(req).enqueue(new Callback() { 
     @Override 
     public void onFailure(Request request, IOException e) { 
      Log.d("Chart", "Network error"); 
      e.printStackTrace(); 
     } 

     @Override 
     public void onResponse(Response response) throws IOException { 
      String body = response.body().string(); 
      Log.d("Chart", body); 

      try { 
       JSONObject jObj = new JSONObject(body); 
       JSONArray jRes = jObj.getJSONArray("results"); 
       for (int i=0; i < jRes.length(); i++) { 
        JSONObject obj = jRes.getJSONObject(i); 
        Value val = new Value(); 
        val.timestamp = obj.getLong("timestamp"); 
        val.value = (float) obj.getDouble("value"); 
        results.add(val); 
       } 

       listener.onDataReady(results); 

      } 
      catch(JSONException jse) { 
       jse.printStackTrace(); 
      } 

     } 
    }); 

} 


public static class Value { 
    public float value; 
    public long timestamp; 

} 

public interface UbiListener { 
    public void onDataReady(List<Value> result); 
} } 

これはJSON応答を取得するクラスです。ここで私はテキストビューで最新の値を表示したいです:私は配列から最初の値を取得しようとしているコードは、onDataready()関数です。私のコードをチェックして助けてください。

public void callAsynchronousTaskHeart() { 
    final Handler handler = new Handler(); 
    doAsynchronousTask = new TimerTask() { 
     @Override 
     public void run() { 
      (new UbidotsClient()).handleUbidots(Datasource, heartVarId, API_KEY, new UbidotsClient.UbiListener() { 
       @Override 
       public void onDataReady(List<UbidotsClient.Value> result) { 
        for (int i = 0; i < result.size(); i++) { 
         float obj = result.get(i).value; 
         heartdata = Math.round(obj); 
        } 
       } 
      }); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        heart_rate.setText(String.valueOf(heartdata)); 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 5000); 
} 

答えて

0

最後の値だけを必要とし、ループする必要がない場合は、

JsonObject lastObject= jsonArray.getJsonObject(jsonArray.length-1);Value val = new Value(); 
val.timestamp = lastObject.getLong("timestamp");       
val.value = (float) lastObject.getDouble("value"); 
+0

私はので、私はすべての値を取得し、チャートに表示されるまでループしていたデータとグラフを取り込むために、私はチャートを使用している別のフラグメントから同じクラスを呼んでいるので、私はループしています。 –

+0

問題は、配列から最新の値を取得して、テキストビューに最新の値を表示できるようにする方法です。 –

+0

タイムスタンプを基にリストをフィルタリングし、最新のデータを取得することができます。最新のデータが必要な場合タイムスタンプを使用して最新のデータのリストを取得することができます。今日のような特定の時間 –

1

私はあなたが正しくしたいことを理解することができませんでしたが、私は理解しているように答えるつもりです。

これらの手順を実行すると、onResponseメソッドから直接TextViewに値を設定できます。

1 - それは名前だと仮定し...インターフェイスを作成textCallback

interface TextCallback{ 
    void setTextViewValue(String value); 
} 

2 - あなたの活動にごインターフェイスを実装し、あなたのTextViewに文字列値を設定しています。

3- UbidotsClientクラスに「thisを使って」あなたの活動からこのインターフェイスを渡すとUbidotsClientクラス内のメンバ変数を作成し、それに着信インターフェイスオブジェクトを設定します。

4-の方法では、この行をループ内に設定します。

if(i == jRes.length() -1) 
    textCallback.setTextViewValue([SET THE VALUE YOU WANT]). 
関連する問題