1

AChartEngineライブラリに問題があります。XYSeriesのインスタンスでremove(index)を呼び出すと、nullポインター例外が発生します。シリーズが存在し、クラッシュの直前にセットカウントを表示していることを知っているので、それは奇妙です。

public View addDataView(){

    int datasetCount = dataset.getSeriesAt(0).getItemCount();
    XYSeries seriesA = dataset.getSeriesAt(0);
    XYSeries seriesB = dataset.getSeriesAt(1);

    /** Enforce max data points on the displayed chart */
    if (datasetCount > maximumDataPoints - 1) {
        System.out.println("SizeOfSeries: "+seriesA.getItemCount());

        seriesA.remove(0);
        seriesB.remove(0);
            }

    //d.getTime() format: 1357120800000
    seriesA.add(new Date().getTime(), 20 + new Random().nextInt() % 100); // PR // TODO
    seriesB.add(new Date().getTime(), 20 + new Random().nextInt() % 100); // BO // TODO;

    dataset = new XYMultipleSeriesDataset();
    dataset.addSeries(seriesA);
    dataset.addSeries(seriesB);

    autoscroll();

    return ChartFactory.getTimeChartView(context, dataset, renderer, "`ss h:mm a");
}   

関連するlogcat出力は次のとおりです。

01-04 14:16:31.806: I/System.out(25215): SizeOfSeries: 20
01-04 14:16:31.806: D/AndroidRuntime(25215): Shutting down VM
01-04 14:16:31.806: W/dalvikvm(25215): threadid=1: thread exiting with uncaught exception (group=0x410fa300)
01-04 14:16:31.806: E/AndroidRuntime(25215): FATAL EXCEPTION: main
01-04 14:16:31.806: E/AndroidRuntime(25215): java.lang.NullPointerException
01-04 14:16:31.806: E/AndroidRuntime(25215):    at org.achartengine.model.XYSeries.getY(XYSeries.java:169)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at org.achartengine.model.XYSeries.initRange(XYSeries.java:83)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at org.achartengine.model.XYSeries.remove(XYSeries.java:140)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at charts.Chart.addDataView(Chart.java:75)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at com.example.pml.PulseRateActivity$ChartThread.onProgressUpdate(PulseRateActivity.java:68)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at com.example.pml.PulseRateActivity$ChartThread.onProgressUpdate(PulseRateActivity.java:1)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:647)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at android.os.Looper.loop(Looper.java:137)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at android.app.ActivityThread.main(ActivityThread.java:4898)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at java.lang.reflect.Method.invokeNative(Native Method)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at java.lang.reflect.Method.invoke(Method.java:511)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
01-04 14:16:31.806: E/AndroidRuntime(25215):    at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

私も同じ問題を抱えてる。Max/Min であったポイントを削除すると、最初は initRange() から問題が発生します。しかし、initRange にコメントした後も、「double removedY = removedEntry.getValue();」という行にヌル ポインターが表示されます。remove() の mXY.removeByIndex(index); のようになります。値が null に設定された要素を返しますが、その理由がわかりません。

Subversion で利用可能な最後のリビジョンで実行しています。常に同時に失敗するとは限らないため、ある種の競合状態のように見えます。チャート上の一定数のポイントを維持する「スライディング ウィンドウ」ループを作成しました。この例では 3 だけなので、3 番目のポイントの後に 1 つ追加するたびに別のポイントを削除します。最初のログは正常に見えます:

01-11 23:06:48.060: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 0
01-11 23:06:48.060: E/AChartGraph(2038): series1.getItemCount(): 1
01-11 23:06:48.060: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 1
01-11 23:06:48.060: E/AChartGraph(2038): series1.getItemCount(): 2
01-11 23:06:48.160: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 2
01-11 23:06:48.160: E/AChartGraph(2038): series1.getItemCount(): 3
01-11 23:06:48.160: E/AChartGraph(2038): Removed item 0. series1.getItemCount(): 2
01-11 23:06:48.160: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 2
01-11 23:06:48.160: E/AChartGraph(2038): series1.getItemCount(): 3
01-11 23:06:48.160: E/AChartGraph(2038): Removed item 0. series1.getItemCount(): 2
01-11 23:06:48.160: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 2
01-11 23:06:48.160: E/AChartGraph(2038): series1.getItemCount(): 3
01-11 23:06:48.160: E/AChartGraph(2038): Removed item 0. series1.getItemCount(): 2
01-11 23:06:48.160: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 2
01-11 23:06:48.160: E/AChartGraph(2038): series1.getItemCount(): 3

これが起こるまで、これは少しずつ続きます。

01-11 23:06:55.300: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 2
01-11 23:06:55.300: E/AChartGraph(2038): series1.getItemCount(): 3
01-11 23:06:55.300: E/AChartGraph(2038): Removed item 0. series1.getItemCount(): 2
01-11 23:06:55.300: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 1
01-11 23:06:55.300: E/AChartGraph(2038): series1.getItemCount(): 2
01-11 23:06:55.300: E/AChartGraph(2038): Removed item 0. series1.getItemCount(): 1
01-11 23:06:55.300: E/AChartGraph(2038): Added 1 item.  getIndexForKey: 2
01-11 23:06:55.300: E/AChartGraph(2038): series1.getItemCount(): 2
01-11 23:06:55.300: W/dalvikvm(2038): threadid=14: thread exiting with uncaught exception (group=0x40bfb930)
01-11 23:06:55.320: E/AndroidRuntime(2038): FATAL EXCEPTION: AsyncTask #4
01-11 23:06:55.320: E/AndroidRuntime(2038): java.lang.RuntimeException: An error occured while executing doInBackground()
01-11 23:06:55.320: E/AndroidRuntime(2038):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at java.lang.Thread.run(Thread.java:856)
01-11 23:06:55.320: E/AndroidRuntime(2038): Caused by: java.lang.NullPointerException
01-11 23:06:55.320: E/AndroidRuntime(2038):     at org.achartengine.model.XYSeries.getY(XYSeries.java:169)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at org.achartengine.model.XYSeries.initRange(XYSeries.java:83)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at org.achartengine.model.XYSeries.remove(XYSeries.java:140)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at com.mbev.android.Tmty.Helpers.AChartGraph.addAndPrune(AChartGraph.java:226)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at com.mbev.android.Tmty.DashboardFragment$startUpdateTmtyThread.doInBackground(DashboardFragment.java:284)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at com.mbev.android.Tmty.DashboardFragment$startUpdateTmtyThread.doInBackground(DashboardFragment.java:1)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-11 23:06:55.320: E/AndroidRuntime(2038):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
01-11 23:06:55.320: E/AndroidRuntime(2038):     ... 3 more

追加されたポイントのインデックスが突然 2 ではなく 1 になり、itemCount も 2 に下がっていることに注意してください。ポイントを失っただけです! より多くのポイントでこれをテストすると、時間がかかり、XYSeries.getY でクラッシュするまで徐々にポイントを「失い」始めるログが表示されます。以前に不思議なことに消えたポイントの1つを取り除こうとしていると思います.

編集1: この場合、時系列をプロットしていましたが、同じキー(この場合は日付)で2つのポイントを追加するとエラーが発生しました。削除機能は、指定されたキーのすべてのポイントを削除しますが、それが意図されたものなのかバグなのかはわかりません。しかし、それはあなたが持っているのと同じエラーかもしれません。

于 2013-01-11T12:46:28.323 に答える