2017-01-06 2 views
0

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

    } 
+1

Echtzeit-Diagramm-Beispielcode anzeigen – cxphong

Antwort

0

findViewById Mit einem Griff auf einem Blick als Funktion lokale Variable wiederholt nicht der richtige Ansatz ist, erhalten in Android. Ihr aktueller Code aktualisiert eine separate Instanz von LineChart von der auf dem Bildschirm angezeigten Instanz.

Stattdessen die Klassenfelder LineChart und PieChart eingeben.

public class MyFragment extends Fragment { 
    private final LineChart lineChart; 
    private final PieChart pieChart; 

    public View onCreateView() { 
     View layout = inflater.inflate(R.layout.activity_device_current_report, container, false); 
     lineChart = layout.findViewById(R.id.curr_chart_temp); 
     pieChart = layout.findViewById(R.id.curr_chart_humid); 
     //insert the rest of your onCreate() code 
    } 
} 

Dann in updateChart() können Sie den Rest des Codes verwenden abgesehen von der Erklärung von LineChart, PieChart und die findViewById. Vergessen Sie nicht, nach dem Ändern des Datensatzes notifyDatasetChanged() aufzurufen.

Verwandte Themen