在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時會慢個一秒顯示,但還是算快了。
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看到另一種解法是用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出來。
if (!isTaskRoot()) {
Log.d(TAG,"Elaucher is root.");
finish();
return;
}