2013-12-18 19 views
0

我來自更多的C++背景,我們擁有豪華的析構函數來優雅地停止後臺操作(包括必要時在UI組件中)。我正在研究一個我想在視覺上呈現wav文件的小型android端項目。我對使用任何庫都不感興趣,這比其他任何工作都更重要。Android View對象管理後臺線程常見嗎?

我正在嘗試創建一個View對象,可以有效地給出一個WavFile對象(我自己設計了一個使用我寫的小型RIFF分析框架的對象)。這個View組件的目標是允許在不同的縮放級別上渲染波形。

主視圖對象(WavView)擴展了Horizo​​ntalScrollView並具有單個波形呈現器子級。這個想法是,隨着縮放係數的增加,孩子可以水平變大,允許用戶滾動縮放波形。

隨着縮放係數的增加,視圖將減小它讀取的樣本的縮小範圍,例如,如果減小範圍是500,則減少的數據集中的每個樣本減少[0] =平均(源[0,499]),減少[1] =平均(源[500,999])等。減小範圍是基於WavView對象的寬度動態計算的,因此默認情況下縮放因子爲1,這意味着波形完全適合WavView(例如不滾動)。

這意味着每次縮放因子或父寬度改變時,我都必須讀取波形文件並根據縮小範圍執行所有縮小操作。我爲解析數據而設計的框架在播放數據時也應該很有用。由於wav PCM樣本是小端,所以這個框架將它們轉換成大端,這樣它也可以用於回放。

所有這些都不便宜,顯然必須在單獨的線程上完成。我希望能夠將所有這些功能封裝在同一類型中,使得將波形文件傳遞給它並進行渲染變得非常簡單。在縮小樣本的同時,父母會顯示進度指示器,完成時會顯示呈現的波形。

但是,當我遇到可能是另一個文件正在設置或活動被殺死的情況下,或者只是從佈局樹中刪除視圖,我顯然需要停止線程。這是Android視圖通常實現的東西嗎?我應該以另一種方式做這個嗎?我想保持儘可能多的封裝。

編輯:AsyncTask似乎是可能對實現這一目標有用的東西。

回答

1

這是android視圖常用的東西嗎?

不,對於視圖來說,處理線程是不常見的做法。 Android中的視圖是MVP意義上的視圖。他們應該能夠很快地將數據呈現給他們,而不是真正意識到任何複雜的業務邏輯。如您所述,將波形傳遞到視圖可能沒有意義,因爲如果沒有線程,解釋波形會導致系統崩潰。

通過編寫一個可以獲取波形並在後臺線程中將其呈現爲位圖的演示者,您可能會更好地服務於此。你可以用這種方式將你的自定義視圖綁定到你的自定義視圖上,使得演示者將完成的位圖發佈到視圖上,該視圖可以非常快地渲染,但演示者總是在將另一個波形寫入另一個線程中的不同位圖。這個演示者應該綁定到一個Activity或Fragment的生命週期,並且你必須處理諸如被刪除,縮放或調整大小的視圖。

+0

感謝您的回答。這實際上就是我打算去的地方,處理文件的解析和繪製位圖,因爲在onDraw期間繪製數百個點的路徑也不會便宜。我沒有意識到我沒有提到那部分(已經有太多的文字了)。我想知道每個視圖實例是否應該管理一個單獨的加載繪製線程,但是對於單個作業隊列來說,處理每個解析和繪製操作可能更好,而不是一次處理多個。 –