簡體   English   中英

如果片段事務未完成,應用程序將崩潰

[英]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);

當您離開FragmentActivity時,從所有正在運行的任務中清除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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM