2015-05-17 13 views
1

我正在嘗試將Android GraphView項目合併到我的應用程序中,並且每次我都遇到一些奇怪的問題。Android GraphView項目獲得實時更新凍結

我的應用需要從實時數據繪製圖形。我有提供數據的所有通信線程。在主線程中,我讀取這些數據,並簡單地使用mSeries1.appendData(new DataPoint(counter,data[0]),true,100);,其中counter是int,每次更新後都會遞增。

不幸的是,在某個點它凍結。我試過把它放在​​區塊中,或者將代碼行改爲mSeries1.appendData(new DataPoint(counter,counter),true,100);,結果仍然如此。

這是應用程序運行時內存的模樣和結冰時:

enter image description here

沒有人有任何的想法在這裏可能是什麼問題?

編輯:

這是我來更新我的圖形視圖當前的方法:

public void onEventMainThread(ReadingsUpdateData data) { 
     mSeries1.appendData(new DataPoint(counter,data.getData()[0]),true,100); 
     counter++; 
    } 

回答

0

雖然在其中添加點你沒有指定的速度,以及多長時間的應用程序運行不崩潰,你應該預料到某些事情會出錯(你可能會生成無限數量的點對象,而內存確實有限)。

您是否需要從開始繪製的應用程序中獲得的所有要點?如果沒有,你可以實現一種循環緩衝區,只有保持你的「提供線索」產生的X最後的值,並在每次收到一個新的價值與方法時間更新圖表

your_series.resetData(dataPoint[] my_circular_buffer_of_data_points); 

This thread相當類似於你的問題,看看它吧!

+0

你的答案看起來很合理,但說實話我不知道如何使用它 - 當你想要使用這種方法?據我現在瞭解,當我從我的線程獲取新數據時,我需要在其他方法中更新緩衝區,然後(但是)將其發送到我的圖視圖更新方法。我仍然需要生成新的'DataPoint'對象。 – sebap123

+1

你用新的數據更新你的循環緩衝區,然後調用我在我的答案中陳述的方法來更新圖形。 您仍將生成新的DataPoint對象,但您也將允許垃圾回收器銷燬您從緩衝區「沖洗」出來的所有DataPoint,從而避免任何類型的內存溢出(除非您超大緩衝區)。 –

+0

我已經添加了我的方法代碼,以便您看到。我仍然沒有得到它 - 如果我將'appendData'改爲'buffer.add(new DataPoint(counter,data.getData()[0])); ((DataPoint [])buffer.toArray());'(其中緩衝區是arraylist)我會有某種緩衝區,但我不認爲這是你想的方式。 – sebap123

1

也許是爲時已晚,但我有類似的問題,最後我發現,當GraphView附加了一個新的「NaN」數據凍結。

因此,檢查結果將是NaN的情況,例如除以零或類似的東西。