我一般面試技術分兩方面了解面試者凡辱,一是測重問面試者細節(jié)的地方鞍帝,看對方是否真如簡歷上所說對XX“精通”、“熟悉”煞茫、“有一定的見解”帕涌,有實踐經(jīng)驗的積累。別一種是側重考察對方對問題(可以是未知問題)的理解和解決問題的思路续徽。
面試題: 如何判斷Activity是否在運行蚓曼?
如下這場景我相信很多人都遇到過,這段話也是從某個帖子截取出來的:
從Activity A 啟動一個線程去進行網(wǎng)絡上傳操作钦扭,在A中設立一個回調(diào)函數(shù)纫版,當上傳操作完成以后,在A的這個回調(diào)函數(shù)中會彈出一個對話框客情,用來顯示回調(diào)信息其弊●海可是當上傳的過程還在進行的時候,我按下back鍵梭伐,A的activity 被銷毀了痹雅,可是那個上傳的線程還在進行,當那個線程結束后糊识,本來應該在A中彈出一個對話框绩社,可是由于A已經(jīng)不存在了,系統(tǒng)就會報錯提示赂苗,“將對話框顯示在不存在的頁面上”愉耙,然后程序就掛掉了。
我看到過很多人用Handler來充當上面所提到的“回調(diào)函數(shù)”拌滋,即工作線程完成工作后朴沿,通過主線程的Handler處理UI更新,如彈出提示Dialog败砂∶跸桑可能有些人沒有弄明白,Activity都被系統(tǒng)銷毀了吠卷,工作線程怎么還能調(diào)它的變量呢锡垄?其實所謂的Activity銷毀只是不再受系統(tǒng)的AMS控制,但Activity這個對象的實例還是存在于內(nèi)存中的祭隔,具體什么時候真正把這個對象實例也銷毀(回收)了货岭,就要看內(nèi)存回收機制了,哪怕是這個實例沒有可達的引用了也不一定會馬上回收疾渴。
針對這種用Handler更新UI的情況千贯,我們需要在操作UI前判斷一下此Activity是否已被銷毀。很多人可能都用過isFinishing來判斷搞坝,用多了就會發(fā)現(xiàn)好象不太準搔谴,為什么呢,看一下它的源代碼:
/**
* 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()中被賦值的桩撮,也就是說只有通過調(diào)用finish()結束的Activity敦第,mFinished的值才會被置為true。所以有時候Activity的生命周期沒有按我們預想的來走時(如內(nèi)存緊張時)店量,會出現(xiàn)判斷出錯的情況芜果。
Android源碼可以使用這個網(wǎng)站查詢: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()的判斷融师。
小結
如果對方?jīng)]聽說過isFinishing函數(shù)右钾,那可以讓他從自己的角度看如何解決這個問題,正好可以看看他的邏輯思維是否清晰合理。工作中往往會遇到舀射,一些求職者由于之前是做其他方面剛轉Android開發(fā)窘茁,對Android的了解還不夠,但有很強理解和學習能力脆烟,通過引導發(fā)現(xiàn)他可以快速的得到合理的解決方案的話山林,我一般都很樂意要這樣的人。