0

私はアンドロイドが初めてで、中空コードを心電図トレースを示すライブ更新グラフに変換するのに助けが必要です。とりあえず正弦曲線で作業しましょう。したがって、移動正弦グラフを表示するグラフが必要です。現在、aChartEngine プラグインを使用して静的グラフを表示する単純なコードを作成しています。スケーラブルなパターン(スレッド/非同期タスク)を使用して移動(ライブ更新)グラフを実装する最も簡単な方法は何ですか?

public class LiveView extends Activity {
Button startTimer;
TextView heartRate, battery;
LinearLayout lineGraphLayout;
View lineGraph;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.liveview);
    startTimer = (Button) findViewById(R.id.bStartTimer);
    heartRate = (TextView) findViewById(R.id.tvHeartRate);
    battery = (TextView) findViewById(R.id.tvBatteryLevel);
    lineGraphLayout = (LinearLayout) findViewById(R.id.lineGraph);
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if (lineGraph == null) {
        // sample Values
        lineGraph = getLineGraphView();
        lineGraphLayout.addView(lineGraph);
    } else
        ((GraphicalView) lineGraph).repaint();
}


private View getLineGraphView() {
    int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // x values!
    int[] y = { 30, 34, 45, 57, 77, -89, 100, 111, 123, 145 }; 
    TimeSeries series = new TimeSeries("Lead 1");
    for (int i = 0; i < x.length; i++)
        series.add(x[i], y[i]);

    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    dataset.addSeries(series);

    XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
    XYSeriesRenderer renderer = new XYSeriesRenderer();
    mRenderer.addSeriesRenderer(renderer);

    View tempView = ChartFactory.getLineChartView(this, dataset, mRenderer);
    tempView.setBackgroundColor(Color.WHITE);
    return tempView;
}

}

TimerTask を使用しようとしましたが、アプリがハングします。

public void toCallAsynchronous() {
    TimerTask doAsynchronousTask;
    final Handler handler = new Handler();
    Timer timer = new Timer();

    doAsynchronousTask = new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            handler.post(new Runnable() {
                public void run() {
                    if (isRunning) {
                        try {
                            lineGraph = getLineGraphView();
                            lineGraphLayout.addView(lineGraph);
                            ((GraphicalView) lineGraph).repaint();

                        } catch (Exception e) {
                            // TODO Auto-generated catch block

                        }
                    }
                }
            });

        }

    };

    timer.schedule(doAsynchronousTask, 0, 50);// execute in every 500
                                                    // ms
4

1 に答える 1

1

ここでは、またはスレッドHandlerよりもaの方が優れていると思います。AsycTaskハンドラーはUIスレッドで直接実行され、実装が簡単です。

public class LiveView extends Activity {
    //...
    RefreshHandler handler = new RefreshHandler();

    class RefreshHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            // Update your graph here
            sendMessageDelayed(obtainMessage(0), 500); // next update in 500 ms
        }
    }
}

リアルタイムの更新を開始するhandler.sendMessage(handler.obtainMessage(0));には、コードのどこかを呼び出します。

于 2012-06-29T10:26:28.977 に答える