我正在使用MPAndroidCharts制作一个线条图,它使用API来接收和显示数据。(这是我所遵循的指南:https://learntodroid.com/how-to-display-a-line-chart-in-your-android-app/)。我已经完成了教程中显示的所有事情,但是我似乎一直在犯同样的错误。这是我的方法,我调用API并尝试从其中检索数据。错误出现在响应体中的x值上。
private void AddCurrentDataValues() {
saunaDataAPI.getHistoricalData(
"Sauna1"
).enqueue(new Callback<List<SaunaBitResponse.SaunaBit>>() {
@Override
public void onResponse(@NonNull Call<List<SaunaBitResponse.SaunaBit>> call, @NonNull Response<List<SaunaBitResponse.SaunaBit>> response) {
ArrayList<Entry> co2Data = new ArrayList<>();
if (response.body() != null) {
for (int i = 0; i < response.body().size(); i++) {
float x = response.body().get(i).time;
float y = response.body().get(i).co2;
if (y != 0) {
co2Data.add(new Entry(x, y));
}
}
Comparator<Entry> comparator = new Comparator<Entry>() {
@Override
public int compare(Entry o1, Entry o2) {
return Float.compare(o1.getX(), o2.getX());
}
};
co2Data.sort(comparator);
setLineChartData(co2Data);
}
}
@Override
public void onFailure(@NonNull Call<List<SaunaBitResponse.SaunaBit>> call, @NonNull Throwable t) {
t.printStackTrace();
}
});
}
这是我从API中检索数据的接口:
public interface SaunaDataAPI {
@Headers({"Accept: application/json"})
@GET("getMeasurementBySaunaName/{name}")
Call<List<SaunaBitResponse.SaunaBit>> getHistoricalData (
@Path("name") String sauna_name
);
@GET("getMeasurementById/{id}")
Call<SaunaBitResponse.SaunaBit> getDataById(
@Path("id") long id
);
}
这是处理响应的类。
public class SaunaBitResponse {
public List<SaunaBit> saunaBits;
public static class SaunaBit {
public String sauna_name;
public long time;
public float temp;
public float co2;
public float humidity;
}
}
这是API中的度量实体:
@Entity
@Table(name = "Measurement")
public class Measurements {
@Id
@Column(name = "measurementId")
private int id;
private String saunaName;
private int Co2;
private int humidity;
private int temperature;
private Time time;
@ManyToOne(cascade =CascadeType.ALL)
private SaunaRoom saunaRoom;
public Measurements() {
}
public Measurements(int id, String saunaName, int co2, int humidity, int temperature, Time time,SaunaRoom saunaRoom) {
this.id = id;
this.saunaName = saunaName;
Co2 = co2;
this.humidity = humidity;
this.temperature = temperature;
this.time = time;
this.saunaRoom= saunaRoom;
}
public SaunaRoom getSaunaRoom() {
return saunaRoom;
}
public void setSaunaRoom(SaunaRoom saunaRoom) {
this.saunaRoom = saunaRoom;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSaunaName() {
return saunaName;
}
public void setSaunaName(String saunaName) {
this.saunaName = saunaName;
}
public int getCo2() {
return Co2;
}
public void setCo2(int co2) {
Co2 = co2;
}
public int getHumidity() {
return humidity;
}
public void setHumidity(int humidity) {
this.humidity = humidity;
}
public int getTemperature() {
return temperature;
}
public void setTemperature(int temperature) {
this.temperature = temperature;
}
public Time getTime() {
return time;
}
public void setTime(Time time) {
this.time = time;
}
}
最后,这是我用来检索数据的API中的get方法:
@GetMapping({"/getMeasurementBySaunaName/{name}"})
private List<Measurements> getMeasurementsBySaunaName(@PathVariable String name){
return measurementService.getMeasurementsBySaunaName(name);
}
StackTrace:
W/System.err: com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "20:36:00"
W/System.err: at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:306)
W/System.err: at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:296)
W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
W/System.err: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
W/System.err: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
W/System.err: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40)
W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
W/System.err: at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153)
W/System.err: at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err: at java.lang.Thread.run(Thread.java:920)
W/System.err: Caused by: java.lang.NumberFormatException: For input string: "20:36:00"
W/System.err: at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
W/System.err: at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
W/System.err: at java.lang.Double.parseDouble(Double.java:538)
W/System.err: at com.google.gson.stream.JsonReader.nextLong(JsonReader.java:964)
W/System.err: at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:304)
W/System.err: ... 14 more
有人知道哪里出了问题吗?提前感谢!
发布于 2022-08-11 09:40:34
所以我终于弄清楚问题出在哪里了。当时我收到了一个字符串值,需要将它解析为可以映射的东西。因此,我将接收到的时间的字符串值转换为:
if (response.body() != null) {
for (int i = 0; i < response.body().size(); i++) {
String responseTime = response.body().get(i).time.substring(0,5);
float x = Float.parseFloat(responseTime.replace(":","."));
float y = response.body().get(i).temp;
if (y != 0) {
tempData.add(new Entry(x, y));
}
System.out.println("ITS GOING THROUGH THE THING");
}
感谢所有帮助我的人!
https://stackoverflow.com/questions/73307373
复制相似问题