[英]App getting crashed if fragment transaction not get completed
我已經點擊了一個按鈕,表明存在從一個片段到另一個片段的片段事務。 同樣在片段事務中,我把 Handler 延遲了 5 秒的事務。 現在的問題是如果我在片段事務完成之前按下后退按鈕,我的應用程序會在這 5 秒完成后崩潰。 下面是我的片段事務代碼和 logcat 錯誤。
片段交易代碼:
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
//Second fragment after 5 seconds appears
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
OtpVerificationFragment otpVerificationFragment = new OtpVerificationFragment();
fragmentTransaction.replace(R.id.fragmentContainerDashboard, otpVerificationFragment);
fragmentTransaction.commit();
}
};
handler.postDelayed(runnable, 5000);
日志錯誤:
java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.fragment.app.FragmentManager androidx.fragment.app.FragmentActivity.getSupportFragmentManager()' on a null object reference.
問題是您在按下后退按鈕時沒有刪除callbacks
。
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
//Second fragment after 5 seconds appears
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
OtpVerificationFragment otpVerificationFragment = new OtpVerificationFragment();
fragmentTransaction.replace(R.id.fragmentContainerDashboard, otpVerificationFragment);
fragmentTransaction.commit();
}
};
您需要啟動延遲時的postDelayed
調用:
handler.postDelayed(runnable, 5000);
按下返回按鈕時刪除回調,如下所示:
handler.removeCallbacks(runnable);
當您離開Fragment
或Activity
時,從所有正在運行的任務中清除Handler
是一個很好的做法,我什至會說這是一個要求。
您應該重寫onDetach
方法並從回調和消息中清除所有處理程序:
@Override
public void onDetach() {
super.onDetach()
handler.removeCallbacksAndMessages(null)
}
而且你應該確保你傳遞的 runnable 的內容只有在當前片段仍然附加到它的上下文並且沒有從 backstack 中刪除時才被執行。
Runnable runnable = new Runnable() {
@Override
public void run() {
//Second fragment after 5 seconds appears
if (!isAdded() || isRemoving()) {
// Avoid execution
return;
}
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
OtpVerificationFragment otpVerificationFragment = new OtpVerificationFragment();
fragmentTransaction.replace(R.id.fragmentContainerDashboard, otpVerificationFragment);
fragmentTransaction.commit();
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.