2012-07-21 54 views
1

我正在構建一個安裝了AChartEngine的Android應用程序,並且出現奇怪的錯誤。添加點和平移後AChartEngine崩潰

後,我加點我已經建立圖表和觸摸/平移圖形,我得到了NullPointerExceptionLineChart(XYChart).getSeriesAndPointForScreenCoordinate(Point),其中GraphicalView的變量oldXoldY被發現是空。這些變量在GraphicalView.onTouchEvent()中設置,但顯然沒有被調用。

初始化我的圖形時是否有辦法手動觸發onTouchEvent(),或者是否有解決此錯誤的方法?

這裏是我的表設置代碼:

mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer); 
mChartView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint(); 
     double[] xy = mChartView.toRealPoint(0); 
     if (seriesSelection == null) { 
      Toast.makeText(viewer.this, 
        "No chart element was clicked", 
        Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(
        viewer.this, 
        "Chart element clicked", Toast.LENGTH_SHORT) 
        .show(); 
     } 
    } 
}); 

這是我如何加點:

protected class NewPoints extends AsyncTask<Double, Void, Void> { 
    @Override 
    protected Void doInBackground(Double... values) { 
     mCurrentSeries.add(values[0], values[1]); // x, y 

     if (mChartView != null) { 
      mChartView.repaint(); 
     } 
     return null; 
    } 
} 

我的測試代碼:

for(double i = 0; i < 10; i++) { 
    new NewPoints().execute(i, Math.log(i)); 
} 

這裏是logcat的輸出:

07-20 18:46:12.570: E/AndroidRuntime(13800): FATAL EXCEPTION: main 
07-20 18:46:12.570: E/AndroidRuntime(13800): java.lang.NullPointerException 
07-20 18:46:12.570: E/AndroidRuntime(13800): at org.achartengine.chart.XYChart.getSeriesAndPointForScreenCoordinate(XYChart.java:840) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at org.achartengine.GraphicalView.getCurrentSeriesAndPoint(GraphicalView.java:135) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at com.maximz.viewer$1.onClick(viewer.java:185) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.view.View.performClick(View.java:3511) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.view.View$PerformClick.run(View.java:14110) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.os.Handler.handleCallback(Handler.java:605) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.os.Looper.loop(Looper.java:137) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.app.ActivityThread.main(ActivityThread.java:4424) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at java.lang.reflect.Method.invokeNative(Native Method) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at java.lang.reflect.Method.invoke(Method.java:511) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-20 18:46:12.570: E/AndroidRuntime(13800): at dalvik.system.NativeStart.main(Native Method) 

更新1:

我重新編譯與AChartEngine源代碼和調試表明,錯誤發生在這個方法:

public SeriesSelection getSeriesAndPointForScreenCoordinate(final Point screenPoint) { 
    if (clickableAreas != null) 
     for (int seriesIndex = clickableAreas.size() - 1; seriesIndex >= 0; seriesIndex--) { 
     // series 0 is drawn first. Then series 1 is drawn on top, and series 2 
     // on top of that. 
     // we want to know what the user clicked on, so traverse them in the 
     // order they appear on the screen. 
     int pointIndex = 0; 
     if (clickableAreas.get(seriesIndex) != null) { 
      RectF rectangle; 
      for (ClickableArea area : clickableAreas.get(seriesIndex)) { 
      rectangle = area.getRect(); // EXCEPTION HERE: area is null 
      if (rectangle != null && rectangle.contains(screenPoint.getX(), screenPoint.getY())) { 
       return new SeriesSelection(seriesIndex, pointIndex, area.getX(), area.getY()); 
      } 
      pointIndex++; 
      } 
     } 
     } 
    return super.getSeriesAndPointForScreenCoordinate(screenPoint); 
    } 

的異常被拋出在rectangle = area.getRect();行,其中area爲空,因爲clickableAreas.get(0)以某種方式返回一個null clickableAreas集合

我打算嘗試使用檢查來檢查clickableArea是否爲空,但這引出了問題:我正確添加點嗎?

+0

你可以發佈你的Logcat指向的例外嗎? – Venkatesh 2012-07-21 05:40:59

+0

你是否得到答案? – Venkatesh 2012-07-21 06:17:01

+0

@Venkatesh:我編輯了問題並添加了相關的LogCat輸出。 – 2012-07-21 17:39:39

回答

0

空指針異常可能是由您的AchartEngine jar文件引起的,有時會在不再使用它的情況下導致無法使用。所以你應該通過右鍵點擊你的項目來檢查你的構建路徑上的jar文件。從選擇的選項

Order and Export->choose your jar files->click up and down button. 

它可以用來打開項目中使用的jar文件。

+0

請檢查。雖然這不是你正在尋找,然後告訴我,我會進一步幫助你。 – Venkatesh 2012-07-21 05:57:48

+0

AChartEngine在'Order and Export'下啓用。你是說我也應該把它移到列表的首位?我認爲順序對依賴關係並不重要。 – 2012-07-21 17:40:50

1

按堆棧跟蹤,在XYChart.java下面第二行代碼出現異常(如果我的源代碼中有匹配的行號):

for (ClickableArea area : clickableAreas.get(seriesIndex)) { 
    rectangle = area.getRect(); // <--- Exception here! 
    if (rectangle != null && rectangle.contains(screenPoint.getX(), screenPoint.getY())) { 
     return new SeriesSelection(seriesIndex, pointIndex, area.getX(), area.getY()); 
    } 
    pointIndex++; 
} 

我看不出如何能發生。

你能用AChartEngine的源代碼和調試來編譯你的代碼嗎?

此外oldX & oldY都聲明爲原始float S IN GraphicalView.java。如果它們是基元,它們怎麼可能是null

+0

謝謝你的回答 - 我已經用調試結果更新了問題。 – 2012-07-24 20:27:43