2011-09-07 72 views
0

我在我的應用程序中有一個導致UpdateActivity的按鈕。此活動不會顯示任何進度條,並且有與該更新一起運行的AsyncTask。Android長時間更新活動

AsyncTask需要相當長的時間,因爲我接觸到服務器並從多個表中檢索信息並將它們插入到sqlite數據庫中,並將數據從本地數據庫發送到服務器。

如果不是更好地使用這個服務,是嗎?另一方面,我懷疑。當我按下後退按鈕時,我離開那個活動,但AsyncTask似乎在後面跑(因爲我有一個敬酒通知用戶工作已完成,並且稍後顯示(即使我已經離開該活動!)。

然後我有另一個活動需要數據讀取和寫入數據庫,所以如果我這樣做,而另一個線程(下載線程)也搞亂了數據庫,是否有可能出現問題有什麼辦法可以防止這種情況發生? 在此先感謝

+0

太多的問題老兄,把它們分開,併發布一些代碼樣本,讓人們瞭解你真正的問題。 –

回答

0

在服務中運行您的任務對於任何長時間運行的操作來說都是一個好主意, 將超出您的活動。

目前線程在離開活動 後仍繼續運行,但是在系統終止進程時可能會終止線程。

向用戶展示已經去過的活動的用戶界面對用戶體驗不利。

最好的辦法是在服務中運行AsyncTask並使用status bar notification顯示狀態更新。通過這種方式,用戶可以根據需要獲得進度更新,並在需要時獲得進度更新 。 帶有狀態通知的服務被視爲長時間運行,除非內存真的很低,否則系統不會終止進程(因此也不會導致線程)。

至於併發訪問數據庫的問題,你應該寫一個ContentProvider來控制對數據庫的訪問。 ContentProviders必須是 線程安全的,並將在您的應用程序的任何部分 中提供統一的數據訪問權限,如果您希望導出數據,甚至可以被其他應用程序使用。

+0

謝謝我看了看起來並不簡單,但我會嘗試。另一方面,如果我有像這樣定義的數據庫適配器:public class SqliteDataBaseAdapter implements Serializable {...}它不會阻止幾個實例嗎? – vallllll

+0

[This](http:// kagii。com/post/6828016869/android-sqlite-locking)鏈接包含有關Android中SQLite鎖定的一些信息。看起來有Java鎖實現,所以你不應該得到腐敗。 – mcnicholls

+0

@mcnicolsls:該鏈接很棒,但有一些代碼用於測試不同的場景,但鏈接已損壞。任何想法,我可以得到該代碼? – vallllll

0

如果您擔心用戶在同步運行時對數據進行更改,那麼將其作爲服務並不能真正幫助您。可以做的是殺死活動onDestroy中的AsyncTask(優雅地) )方法,這樣如果用戶單擊後退箭頭,任務將不會繼續運行。

+0

以及我在想什麼,但另一方面,如果我殺了asynk任務,所以也許數據將只有一半加載/一半更新。我只是逐一更新我的所有表格。所以如果數據沒有被正確更新,這意味着該應用程序是無用的,所以我想知道是否有辦法阻止用戶停止更新中途的低谷。 – vallllll

+0

另一個想法是防止用戶在更新運行時能夠按下「後退」按鈕。您可以通過覆蓋onBackPressed()方法並引入一些邏輯來告訴它ProgressDialog是否處於活動狀態。 – SBerg413