0

我确实编写了一些代码来更新 AChartEngine 中条形图的数据。当我在调试模式下运行代码时,新点被添加到数组中。但是新的条形图没有显示在屏幕上。我使用 AsyncTask 进行更新。

异步任务:

 private class ChartTask2 extends AsyncTask<Void, String, Void>{
            // Generates dummy data in a non-ui thread
            @Override
            protected Void doInBackground(Void... params) {
                try{
                    for(int i = 0; i < 5; i++) {
                        Log.v("Asyntask", "doInBackground");
                        String [] values = new String[2];

                        values[0] = Double.toString(6+ i);
                        values[1] = Double.toString(6 +i);

                        publishProgress(values);
                        Thread.sleep(1000);
                        Log.v("i", Integer.toString(6+i));
                    }
                }catch(Exception e){ }
                return null;
            }
            // Plotting generated data in the graph
            @Override
            protected void onProgressUpdate(String... values) {
                _series.add("Bar" + Double.parseDouble(values[0]),Double.parseDouble(values[1]));
                _mChartView.repaint();
                Log.v("Asyntask", "repaint onProgressUpdate");
            }
        }

OneCreate 因为它是一项活动

@Override
protected void onCreate(Bundle savedInstanceState)  {
            super.onCreate(savedInstanceState);

            Log.v("inCreate","inCreate");
            // Get ALL the data!!!
            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                this._chartTitle = extras.getString("chartTitle");
                this._xTitle = extras.getString("xTitle");
                // and other variables are filled here
            }
            setData();
            Log.v("method","call Asynctask");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
                new ChartTask2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[])null);
            else
                new ChartTask2().execute();
        }

设置所有数据:

public void setData() {
        Log.v("method","setData");
        // Add the bar data
        dataset = new XYMultipleSeriesDataset();
        for( int bars = 0; bars < (_yCoords.length); bars++){
            _series = new CategorySeries(_barNames[bars]);
            for (int point = 0; point < (_yCoords[bars].length); point++){
                _series.add("Bar " + _yCoords[bars][point],  _yCoords[bars][point]);
            }
            dataset.addSeries(_series.toXYSeries());
        }

        // Holds a collection of XYSeriesRenderer and customizes the graph
        mRenderer = new XYMultipleSeriesRenderer();

        // Customize Bars
        for(int i = 0; i < _yCoords.length; i++){
            _renderer = new XYSeriesRenderer();                 
            _renderer.setColor(_colors[i]);
            _renderer.setDisplayChartValues(_displayValues[i]);
            _renderer.setChartValuesSpacing(_valuesSpacing[i]);                 

            mRenderer.addSeriesRenderer(_renderer);
     }
        // Set optional settings
        mRenderer.setChartTitle(_chartTitle);
        //and more data is set here

        setContentView(drawData());
    }

我如何绘制数据:

public View drawData()  {
                Log.v("method","tekenData");

                // Set background
                View view = View.inflate(this, _layout, null);

                // Getting a reference to view group linear layout chart_container
                LinearLayout chartContainer = (LinearLayout) view.findViewById(_wrapper);

                // Getting LineChartView to add to the custom layout
                _mChartView = ChartFactory.getBarChartView(this, dataset, mRenderer, Type.DEFAULT);

                // Adding the line chart to the custom layout
                chartContainer.addView(_mChartView);

                return view;
        }

奇怪的是,同样的结构在折线图上效果很好。但是通过这个条形图它并没有重新绘制好。

谢谢您的帮助 :)

4

2 回答 2

2

在我看来,dataset在将值添加_seriesonProgressUpdate. 您只是在 中更新/创建它setData(),您不会从 AsyncTask 再次调用它。getBarChartView从数据集中读取数据,但数据集现在已过时。

于 2013-05-29T12:47:32.883 回答
0

代码现在可以工作了,这就是我改变它的方式:

将此添加到顶部的变量中:

    XYSeries _xySeries;

更改了 OnprogressUpdate:

  @Override
  protected void onProgressUpdate(String... values) {
                    _xySeries.add(Double.parseDouble(values[0]),Double.parseDouble(values[1]));
                    _mChartView.repaint();
   }

和setData:

public void setData() {
                // Add the bar data
                dataset = new XYMultipleSeriesDataset();
                for( int bars = 0; bars < (_yCoords.length); bars++){
                    _series = new CategorySeries(_barNames[bars]);
                    for (int point = 0; point < (_yCoords[bars].length); point++){
                        _series.add("Bar " + _yCoords[bars][point],  _yCoords[bars][point]);
                    }
                    _xySeries = _series.toXYSeries();
                    dataset.addSeries(_xySeries);
                }
//.... and more of the old setData

所以我做了一个xyserie类型的新系列。将数据添加到旧系列,然后将其转换为 xy 系列。因此,您可以在任何地方更新它并将其添加到数据集中。

于 2013-05-30T07:53:39.857 回答