2013-08-03 19 views
3

我正在做一個應用程序的SplashScreen ...當應用程序啓動時,它開始LoadingActivity ...睡3秒,完成();然後啓動MainActivity。 Splash用於更新數據庫。如果數據庫已經更新,無論如何我仍然想要飛濺3秒。在開始另一個活動之前使用Thread.sleep(毫秒)等待一點,這是不好的做法嗎?

我使用下面的代碼:

protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 
    try { 
     Thread.sleep(3000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } finally { 
     Intent intent = new Intent(LoadingActivity.this, MainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 
} 

它是一個不好的初步實踐?爲什麼?該應用程序在AVD中運行得非常好。

+3

如果您在主用戶界面中運行睡眠,那麼您將凍結用戶界面,並且會導致活動不響應錯誤(ANR)。使用處理程序postdelayed函數。 – Tarun

+2

在主線程上執行阻塞操作*總是*一個壞主意,句號。 'postdelayed'就是答案。 –

回答

6

睡在UI線程上是總是不好主意。在這種情況下,您位於UI線程中的onPostExecute

將您的睡眠拋入AsyncTaskdoInBackground方法中,您不會在那裏得到任何ANR(Android未響應)。

用戶不喜歡等待啓動畫面,所以最好不要等待。但有時需要啓動屏幕(即由於合同)。

+0

我沒有提到,但需要更新數據庫(如果過時),請使用Splash –

+3

然後告訴他們你在做什麼,只要你需要爲了完成它而只停留在那裏。 –

-4

如果這是Programm的開頭,你可以做一段時間循環,直到System.currentTimeMillis()高於3000而不是程序的開始。

+1

這比睡覺更糟糕的想法。 –

+0

你能給出建設性的意見嗎告訴我爲什麼? – MinecraftShamrock

+0

這更糟糕...... –

5

是的,這是不好的做法,在UI線程上調用,所以基本上你阻止你的UI線程整整3秒。我懷疑你想顯示一個啓動畫面。你可以這樣做。

new Handler().postDelayed(new Runnable(){ 
    @Override 
    public void run(){ 
     Intent intent = new Intent(LoadingActivity.this, MainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 
},3000); 

,如果你想堅持AsyncTask然後覆蓋在它doInBackground()和睡眠和開展onPostExecute()Activity正常。

+0

我沒有提到,但需要更新數據庫(如果過時)...所以我需要異步嗎? –

+0

是的,那麼你需要'AsyncTask',在'doInBackground()'中同步你的數據庫,然後在'onPostExecute()'啓動你的下一個'Activity'。 –

相關問題