Ich habe ein Tortendiagramm (MPAndroidChart) Daten über Volley erhalten und ich verwende das folgende, um das Diagramm alle 3 Sekunden zu aktualisieren, aber das Diagramm wird nicht erneut gezeichnet. Dies alles befindet sich in einem Fragment, das in einer Registerkartenansicht angezeigt wird. Das Diagramm wird nur aktualisiert, wenn ich auf eine andere Registerkarte klicke und zurück gehe. Es wird nicht neu gezeichnet, während ich auf der Seite bin.Wie neu Diagramm alle x Sekunden mit MPAndroidChart neu zeichnen?
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.activity_device_current_report, container, false);
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
new AttemptJson().execute();
}
}, 3000);
return layout;
}
Ich habe eine innere Klasse AttemptJson:
class AttemptJson extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
updateChart();
return "";
}
}
Das ist mein updateChart Methode, die die JSON-Datei und speichert packt es Volley verwenden.
private void updateChart() {
requestQueue = Volley.newRequestQueue(getContext());
JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray dataset = response.getJSONArray("dataset");
JSONArray time = response.getJSONArray("time");
JSONArray temp = dataset.getJSONObject(0).getJSONArray("data");
JSONArray humid = dataset.getJSONObject(1).getJSONArray("data");
for (int i = 0; i < temp.length(); i++) {
float temp_data = Float.parseFloat(temp.getJSONObject(i).getString("value"));
float time_data = Float.parseFloat(time.getJSONObject(i).getString("time"));
temperature.add(new Entry(time_data, temp_data));
}
float data = (float)(Float.parseFloat(humid.getJSONObject(humid.length()-1).getString("value")) + Math.random()*20 - 5);
if(humidity.size() != 0) humidity.clear();
humidity.add(new PieEntry(data));
humidity.add(new PieEntry(100 - data));
drawGraph();
} catch (JSONException e) {
Log.d("debug", "Object dataset is incorrect");
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(req);
}
In diesem Verfahren nenne ich DrawGraph(), um die tatsächlichen Graphen zu zeichnen:
private void drawGraph() {
LineChart temperatureChart;
PieChart humidityChart;
LineDataSet lineDataSet1 = new LineDataSet(temperature, "temperature");
lineDataSet1.setDrawCircles(false);
lineDataSet1.setColor(Color.BLUE);
lineDataSet1.setDrawValues(false);
temperatureChart = (LineChart) getActivity().findViewById(R.id.curr_chart_temp);
humidityChart = (PieChart) getActivity().findViewById(R.id.curr_chart_humid);
temperatureChart.setData(new LineData(lineDataSet1));
temperatureChart.getAxisLeft().setAxisMinimum(-50f);
temperatureChart.getAxisLeft().setAxisMaximum(50f);
temperatureChart.getAxisRight().setEnabled(false);
temperatureChart.animateX(2000);
temperatureChart.setVisibleXRangeMaximum(400);
temperatureChart.invalidate();
PieDataSet dataset = new PieDataSet(humidity,"Humidity");
dataset.setColors(new int[]{Color.RED,Color.WHITE});
PieData humidValue= new PieData(dataset);
humidValue.setDrawValues(false);
humidityChart.setData(humidValue);
DecimalFormat df = new DecimalFormat("#.##");
humidityChart.setCenterText(df.format(humidity.get(0).getValue()) + "%");
humidityChart.setDrawCenterText(true);
humidityChart.animateY(1000);
}
Echtzeit-Diagramm-Beispielcode anzeigen – cxphong