2011-12-20 86 views
0

我有一個Android應用程序,它依賴於web服務返回的值。該值每週只更改一次。客戶應該檢測到這個變化的值,但是他們發現這種變化的確切時間並不重要,12到24小時之後應該沒問題。我應該安排在Android自定義應用程序類onCreate()方法中執行的操作嗎?

我的當前實現在自定義Application類的onCreate()方法中啓動一個IntentService,該方法從webservice中檢索值。我還將最後一次檢索的值保存在SharedPreferences中,因此應用程序不必等到檢索到該值。

現在我的問題是,如果有必要在onCreate()方法中第一次檢索後計劃檢索此值,比方說12小時後。我知道onCreate()方法在應用程序的生命週期中只調用一次,但我不知道Android系統會終止應用程序的可能性。假設應用程序將被終止足夠多的時間以便不需要調度是否合理?如果我應該安排這次手術,那麼最好的方法是什麼?

+0

如果你使用onCreate,我不認爲你會有任何保證,它會被稱爲第二次。例如。如果用戶插入手機進行充電,則會關閉睡眠狀態並讓應用程序持續運行數日。非常不可能,但並非不可能。如果我是你,我會設置某種計劃任務。也許這個鏈接將有所幫助 - http://developer.android.com/resources/articles/timed-ui-updates.html。 – 2011-12-20 13:07:52

+0

你提出的場景是我問這個問題的原因:)在鏈接的文章中,處理程序和postDelayed()方法的代碼示例對我來說看起來不錯,我認爲它也是一個有效的解決方案? – 2011-12-20 13:22:14

+0

我將實施您的鏈接文章中概述的解決方案。如果你把它放在你自己的答案中,我會接受你的答案。如果不是,我會在稍後回答我自己的問題。 – 2011-12-20 14:08:52

回答

1

如果您使用的是onCreate(),我不認爲您有任何擔保,它將被稱爲第二次。例如。如果用戶插入手機進行充電,則會關閉睡眠狀態並讓應用程序持續運行數日。非常不可能,但並非不可能。

如果我是你,我會設置某種計劃任務。也許這個鏈接將幫助:

http://developer.android.com/resources/articles/timed-ui-updates.html

的示例使用OnClickListener取消任務。

OnClickListener mStopListener = new OnClickListener() { 
    public void onClick(View v) { 
     mHandler.removeCallbacks(mUpdateTimeTask); 
    } 
}; 

你可能想把它放在onDestroy()的其他地方。

+0

我實現了這一點,就像一個魅力。我在我的Application類的onTerminate()方法中調用了handler.removeCallbacks()。但我不認爲這是必要的,因爲我的理解是,在應用程序終止的情況下,應用程序的主線程也會關閉,並且此線程消息隊列中的所有發佈消息也將被刪除。 – 2011-12-20 14:35:28

+0

嗯,不知道有關發佈的消息。如果可能,我會明確地刪除它們。此外,'Application.onTerminate()'不保證運行 - *它永遠不會在生產Android設備上調用* - http://developer.android.com/reference/android/app/Application.html#onTerminate% 28%29。 – 2011-12-20 14:42:24

+0

關於onTerminate()的好處,我不知道。至於刪除消息:根據http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,如果活套終止,則放棄%20long%29消息,這如果一個進程被殺死的話會發生 – 2011-12-20 14:58:28

0

有幾個選擇,因爲我有類似的設計挑戰。兩者都有優點和缺點。

選項A

你可以有一個閃屏,像許多應用程序,並使用asyncTask類Web請求和更新您的共享偏好。您可以設置自定義超時時間,以便應用程序不會在啓動屏幕上停留太久。不管結果如何,如果更新或者沒有更新,您都可以加載sharedPreferences中的內容,並將其用於該運行中的應用程序使用情況。

關於這一點的好處是,每次應用程序啓動時,您不必擔心數據是否爲最新版本,因爲您只需去獲取它。對於性能更新,您還可以存儲上次更新sharedPref值(例如,您獲得的值小於12小時前),因此可以跳過Web請求 - 結果使您的啓動畫面可以快速前後移動。

選項B

您可以使用通過AlarmManager報警,這會比這將是一個不必要的電池漏極的服務要好得多。甚至有一天的「INTERVAL_DAY」時間間隔的枚舉。當警報被觸發時,廣播接收器將執行您的自定義代碼,以使網絡請求獲得值並存儲它們。您可以說明「重複報警」是否爲單次使用。

希望有所幫助。

編輯:有沒有唯一的選擇只是我選擇的相關性。

+0

我不想使用啓動畫面,因爲我的應用程序只顯示運動結果,因此如果不需要,我的用戶不想等待。此外,選項A並不處理保羅格里姆在他對我的問題的評論中概述的情況。選項B是處理我的問題的好方法,但我認爲這對我的需求來說過於複雜。但是,無論如何感謝您的意見。 – 2011-12-20 14:07:41

相關問題