2013-04-29 63 views
1

我有一個擴展Application的類,在onCreate方法中,我從數據庫加載一些東西,它沒有意義,所以它是異步的,因爲沒有這些數據的應用程序是沒用的。 1.問題:當加載需要幾秒鐘,Android會顯示ANR。 2.問題:我可以從擴展的應用程序類中顯示一個對話框嗎?從應用程序中顯示對話框

pd = new ProgressDialog(this); 

pd = new ProgressDialog(getApplicationContext()); 

E/AndroidRuntime(14168): java.lang.RuntimeException: Unable to create application com.example.skelett.GlobalApp: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

兩個resultet我應該大概做所有的東西裝在我的第一個ActivityonCreate方法? 我怎樣才能防止ANR當我想要阻止用戶界面,直到我的東西被加載?

+0

你寫的AsyncTask該代碼? – 2013-04-29 08:12:12

+2

不要使用'getApplicationContext()'創建對話框。對話框需要一個活動上下文才能附加到屏幕上。另一方面,加載數據而不顯示ANR只是使用AsyncTask或其他一些在後臺線程上工作的類。 – hardartcore 2013-04-29 08:44:07

回答

0

您應該始終在不同的線程上執行此類操作。您可以在加載數據時顯示進度條,以顯示發生了什麼情況。這樣你就不會讓用戶猜測究竟發生了什麼。您可以在progressBar中顯示一條有意義的消息,說「數據正在加載」,這將足夠好。

避免在UI線程上進行長時間的操作。改爲使用Asynctask。或者,如果要加載的數據位於應用程序的第一個屏幕上,則可以在應用程序啓動時顯示一個SplashScreen,並在SplashScreen顯示屏中獲取後臺數據,以便在屏幕的第一個屏幕應用出現。

閱讀Keeping your app responsive瞭解更多詳情。

1

你不應該讓你的應用程序凍結。決不。執行AsyncTask中的加載內容並向用戶顯示一些進度,添加用於取消加載的選項。如果沒有數據就沒用,告訴用戶他應該等待這個過程完成,並在用戶確認後再次啓動,否則退出應用程序。

0

由於以前的答案已覆蓋你會更好裝載您在AsyncTask試圖顯示ProgressDialog當你崩潰的原因是Application上下文無法創建UI元素的數據,你需要用Activity做到這一點上下文。

一個簡單的方法來完成這一點是設置一個標誌,當數據完成加載,當你的第一個屏幕啓動它可以顯示對話框,如果標誌還沒有設置。當數據加載時,您也可以發送Broadcast,以便您的Activity知道隱藏對話框。

0

您正在接近問題: 您應該做的是在顯示的第一個活動中開始加載數據,並在該活動中顯示進度條/對話框以通知用戶他/她必須等待。

如果加載需要一些時間(比方說,可以採取> 1秒)我建議你結合使用IntentServiceResultReceiver,而不是AsyncTask,因爲它是一個更強大的模型(例如,與取向的變化沒有問題)。

你可以看到在應用程序代碼中的例子中,我開源:http://bit.ly/ZR2n8R

相關問題