我坚持以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);
}
答案 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");