Android面試集錦系列(29)——如何判斷Activity是否在執行?
我一般面試技術分兩方面瞭解面試者,一是測重問面試者細節的地方,看對方是否真如簡歷上所說對XX“精通”、“熟悉”、“有一定的見解”,有實踐經驗的積累。別一種是側重考察對方對問題(可以是未知問題)的理解和解決問題的思路。
面試題: 如何判斷Activity是否在執行?
如下這場景我相信很多人都遇到過,這段話也是從某個帖子截取出來的:
從Activity A 啟動一個執行緒去進行網路上傳操作,在A中設立一個回撥函式,當上傳操作完成以後,在A的這個回撥函式中會彈出一個對話方塊,用來顯示回撥資訊。可是當上傳的過程還在進行的時候,我按下back鍵,A的activity 被銷燬了,可是那個上傳的執行緒還在進行,當那個執行緒結束後,本來應該在A中彈出一個對話方塊,可是由於A已經不存在了,系統就會報錯提示,“將對話方塊顯示在不存在的頁面上”,然後程式就掛掉了。
我看到過很多人用Handler來充當上面所提到的“回撥函式”,即工作執行緒完成工作後,通過主執行緒的Handler處理UI更新,如彈出提示Dialog。可能有些人沒有弄明白,Activity都被系統銷燬了,工作執行緒怎麼還能調它的變數呢?其實所謂的Activity銷燬只是不再受系統的AMS控制,但Activity這個物件的例項還是存在於記憶體中的,具體什麼時候真正把這個物件例項也銷燬(回收)了,就要看記憶體回收機制了,哪怕是這個例項沒有可達的引用了也不一定會馬上回收。
針對這種用Handler更新UI的情況,我們需要在操作UI前判斷一下此Activity是否已被銷燬。很多人可能都用過isFinishing來判斷,用多了就會發現好象不太準,為什麼呢,看一下它的原始碼:
/** * Check to see whether this activity is in the process of finishing, * either because you called {@link #finish} on it or someone else * has requested that it finished.This is often used in * {@link #onPause} to determine whether the activity is simply pausing or * completely finishing. * * @return If the activity is finishing, returns true; else returns false. * * @see #finish */ public boolean isFinishing() { return mFinished; } /** * Returns true if the final {@link #onDestroy()} call has been made * on the Activity, so this instance is now dead. */ public boolean isDestroyed() { return mDestroyed; }
而mFinished是在finish()中被賦值的,也就是說只有通過呼叫finish()結束的Activity,mFinished的值才會被置為true。所以有時候Activity的生命週期沒有按我們預想的來走時(如記憶體緊張時),會出現判斷出錯的情況。
Android原始碼可以使用這個網站查詢:androidxref
看看Google工程師是怎麼判斷的(來源於Android原始碼中的Call應用,AsyncTask中的onPostExecute片段):
@Override protected void onPostExecute(Void result) { final Activity activity = progressDialog.getOwnerActivity(); if (activity == null || activity.isDestroyed() || activity.isFinishing()) { return; } if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } }
多了一個isDestroyed()的判斷。
小結
如果對方沒聽說過isFinishing函式,那可以讓他從自己的角度看如何解決這個問題,正好可以看看他的邏輯思維是否清晰合理。工作中往往會遇到,一些求職者由於之前是做其他方面剛轉Android開發,對Android的瞭解還不夠,但有很強理解和學習能力,通過引導發現他可以快速的得到合理的解決方案的話,我一般都很樂意要這樣的人。
最後
在現在這個金三銀四的面試季,我自己在網上也蒐集了很多資料做成了文件和架構視訊資料免費分享給大家【 包括高階UI、效能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料 】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料獲取方式:加入Android架構交流QQ群聊:513088520 ,進群即領取資料!!!
點選連結加入群聊【Android移動架構總群】:加入群聊

資料大全