2

ブルートゥースからデータを受信して​​から、それを TextView に表示し、AChartEngine を使用してプロットします。最初にアクティビティを開始すると、プロットは問題なく表示されます。通知(テキストビュー)にも同じデータを表示します。HOME ボタンを押すと、通知のデータが更新されているため、アクティビティがまだ実行中であることがわかります。しかし、アクティビティに戻ると、グラフはプロットされず、TextView は空のままです (レイアウトがリセットされました)。

このトピックについていくつか読んだことがありますが、毎回レイアウトの状態を保存する必要があると思います。しかし、AChartEngine のプロットとテキストビューでそれを行う方法がわかりません。

変更を追跡し、変更ごとにレイアウトを保存する必要があることを読みましたonPauseまたはonStop. を使用する必要があることを読みましたonConfigurationChanged

AChartEngineとの状態を保存する方法を誰かに説明してもらえますTextViewか? アプリケーションがバックグラウンドで実行されている場合でもグラフは「更新」されている必要があり、レイアウトを復元すると、グラフ内の古いデータが復元されるので、すべてが混乱します。それとも最新のデータを表示しますか?

ありがとう

更新 (1): 次のコードを追加しました (@Dan が提案したサンプルを使用):

@Override
protected void onSaveInstanceState(Bundle outState) {
    //TODO 
    super.onSaveInstanceState(outState);
    // save the current data, for instance when changing screen orientation
    outState.putSerializable("datasetHR", mDatasetHR);
    outState.putSerializable("datasetRR", mdatasetRR);
    outState.putSerializable("datasetO2", mDatasetO2);

    outState.putSerializable("rendererHR", mRendererHR);
    outState.putSerializable("rendererRR", mRendererRR);
    outState.putSerializable("rendererO2", mRendererO2);

    outState.putSerializable("current_seriesHR", HRCurrentSeries);
    outState.putSerializable("current_seriesRR", RRCurrentSeries);
    outState.putSerializable("current_seriesO2", O2CurrentSeries);

    outState.putSerializable("current_rendererHR", hrrenderer);
    outState.putSerializable("current_rendererRR", rrrenderer);
    outState.putSerializable("current_rendererO2", o2renderer);

    outState.putSerializable("current_TV_HR", tvHR);
    outState.putSerializable("current_TV_RR", tvRR);
    outState.putSerializable("current_TV_O2", tvO2);

}

@Override
protected void onRestoreInstanceState(Bundle savedState) {
    super.onRestoreInstanceState(savedState);
    // restore the current data, for instance when changing the screen orientation
    mDatasetHR = (XYMultipleSeriesDataset) savedState.getSerializable("datasetHR");
    mdatasetRR = (XYMultipleSeriesDataset) savedState.getSerializable("datasetRR");
    mDatasetO2 = (XYMultipleSeriesDataset) savedState.getSerializable("datasetO2");

    mRendererHR = (XYMultipleSeriesRenderer) savedState.getSerializable("rendererHR");
    mRendererRR = (XYMultipleSeriesRenderer) savedState.getSerializable("rendererRR");
    mRendererO2 = (XYMultipleSeriesRenderer) savedState.getSerializable("rendererO2");

    HRCurrentSeries = (XYSeries) savedState.getSerializable("current_seriesHR");
    RRCurrentSeries = (XYSeries) savedState.getSerializable("current_seriesRR");
    O2CurrentSeries = (XYSeries) savedState.getSerializable("current_seriesO2");

    hrrenderer = (XYSeriesRenderer) savedState.getSerializable("current_rendererHR");
    rrrenderer = (XYSeriesRenderer) savedState.getSerializable("current_rendererRR");
    o2renderer = (XYSeriesRenderer) savedState.getSerializable("current_rendererO2");


    tvHR = (TextView) savedState.getSerializable("current_TV_HR");
    tvRR = (TextView) savedState.getSerializable("current_TV_RR");
    tvO2 = (TextView) savedState.getSerializable("current_TV_O2");

}

しかし、それでも役に立ちません。TextView とグラフは元の状態に復元されます。問題はそれ以上です。Bluetoothから常にデータを受信して​​います。そのデータを AChartEngine にプロットし、TextView に入ってきたときに表示します。onPauseおよびを経てアクティビティが再開された後onStop、データは更新されていません。

ハンドラーが を受け取ると更新されMESSAGE_READ、メソッドが実行されます。そのメソッドでは、次を使用して TextView を更新します。

TextView tvHR = (TextView) findViewById(R.id.HRdisplay); // update the textview
TextView tvRR = (TextView) findViewById(R.id.RRdisplay); // update the textview
TextView tvO2 = (TextView) findViewById(R.id.O2display); // update the textview
tvHR.setText(hr);
tvRR.setText(rr);
tvO2.setText(o2);

onPauseアクティビティがバックグラウンドに送信された後 (およびを通過onStop)、再開された後、TextView は更新されません。しかし、同じメソッドが通知を更新し、受信データが常に更新されていることを確認できるため、データが入ってきて上記のコードを通過することはわかっています。

更新 #2:onResume内部 に次のコードを追加しました。

    if (savedInstanceState != null) {
        //Then the application is being reloaded
        onRestoreInstanceState(savedInstanceState);
    }

しかし、まだ元の状態には戻っておらず、TextView と Graph の表示はまだ更新されていません。

4

1 に答える 1

0

チャートとテキストビュー値のデータセットとレンダラーをオーバーライドonSaveInstanceStateして保存し、取得する必要があります。ここonRestoreInstanceStateで例を見てください。

于 2013-02-21T06:11:10.917 に答える