在我的應用程序的最新版本中,有些用戶遇到了我無法重現的崩潰。目前只有Samsung
設備運行Lollipop
有問題,但這可能只是巧合。 分析堆棧跟蹤和相關代碼後,我認爲我可能找到了罪魁禍首。爲了測試我的假設,我簡化了代碼,下面的代碼片段:在onDestroy之後是否可以調用回調方法?
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button b = new Button(this);
b.setText("Click me!");
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Handler().post(new Runnable() {
@Override
public void run() {
// This is the callback method
Log.d("TAG", "listenerNotified");
}
});
}
});
setContentView(b);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG", "onDestroy");
}
}
每次我先點擊該測試上面的應用點擊我按鈕,然後單擊後退按鈕,listenerNotified
被打印到控制檯前onDestroy()
。
但我不確定是否可以依靠這種行爲。 Android
對上述情況做出任何保證?我可以安全地假設我的Runnable
將始終在onDestroy()
之前執行,或者在某種情況下不會出現這種情況?在我的真實應用程序中,當然會有更多的事情發生(像其他線程發佈到主線程以及更多操作發生在回調中)。但是這個簡單的片段似乎足以證明我的擔憂。
是否有可能(可能是由於其他線程或回調發布到主線程的影響),我得到下面的調試輸出?
D/TAG: onDestroy
D/TAG: listenerNotified
我想知道這一點,因爲可能的結果會解釋崩潰。
你爲什麼要通過處理程序發佈runnable?同時,你可以看看http://stackoverflow.com/questions/31432014/onclicklistener-fired-after-onpause –
當你有像這樣的異步回調時,你應該總是檢查回調,如果'活動'仍然活着處理回調。最簡單的方法是調用'isFinishing()',如果'Activity'不再是「活動」,則返回'true'。 –