# Android生命週期  ## 在onResume()呼叫API物件 Error: ``` java.lang.IllegalStateException: calling this from your main thread can lead to deadlock ``` 在寫主畫面時,第一時間必須輸出檔案,又要顯示recyclerView,導致進app時,同一時間onResume()和onCreate()裡的UI部分同時呼叫class可能造成死結,查了一下好像在拿GoogleAuthUtil的token時也很容易出現一樣的問題。 我的解法是將export函數使用new thread執行,剛進app讀取recyclerView時會慢個一秒顯示,但還是算快了。 ```java= private void exportSettings() { showLoading(); new Thread(new Runnable() { @Override public void run() { boolean apiResponse = KeyAPI.exportSettings(MainActivity.this); if (apiResponse == true) { loadConfigs(); } else { Log.e(LOG_TAG, "Export failed."); } } }).start(); } ``` 還有在[stack overflow](https://stackoverflow.com/questions/17547019/calling-this-from-your-main-thread-can-lead-to-deadlock-and-or-anrs-while-getti)看到另一種解法是用AsyncTask,但考慮到exportSetting執行完才能執行下一個步驟,這個方法可能不太適合。 ## 重新打開App會再做一次OnCreate() 後來又遇到生命週期的bug,每次暫時切換到別的App再開回來的時候,app又會做一次onCreate(),很奇怪,明明切別的App時候最後一步驟做的是OnPause(),照理來說必須做onDestroy()之後才會再重新OnCreate()。 查了一些資料之後才知道原來這是原生的bug,當你再次打開app時,手機不會從已開啟的app stack裡呼叫原本打開過的app,他會重新再從onCreate從頭跑一遍。 我的解法是在onCreate()開頭的地方加入判斷,如果已經開過app的話,destroy重新開啟的app,系統就會從已開啟app stack叫原本的app出來。 ```java= if (!isTaskRoot()) { Log.d(TAG,"Elaucher is root."); finish(); return; } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up