Android - 从数组中获取最新值并在TextView中显示

时间:2017-08-31 07:04:03

标签: android arrays json

我坚持以JSON的形式从Ubidots获取来自阵列的最新值。我想从数组中获取最新值并在TextView上显示它。这是我的JSON代码。我在这里使用List,因为我还将整个JSON填充到图形中。现在问题是从整个结果中只获得1个最新值

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

2 个答案:

答案 0 :(得分:1)

我不知道我能理解你想要什么,但我会按照我的理解回答。

您可以通过执行以下步骤直接从onResponse方法将值设置为TextView。

1-创建界面...假设它的名称是 textCallback

interface TextCallback{
   void setTextViewValue(String value);
}

2-实现您的活动界面并将字符串值设置为TextView。

3-通过您的活动&#34;使用this&#34;到 UbidotsClient Class 并在UbidotsClient类中创建一个成员变量,并将传入的接口对象设置为它。

4- in onResponse方法在循环内设置此行。

if(i == jRes.length() -1)
    textCallback.setTextViewValue([SET THE VALUE YOU WANT]).

答案 1 :(得分:0)

如果您只想要最后一个值,则无需循环。

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