2013-03-30 32 views
2

當我迅速按下回來,回來,回到我的手機我有以下異常:NPE在FragmentManagerImpl.popBackStackImmediate()

java.lang.NullPointerException 
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1378) 
at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:437) 
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:452) 
at android.app.Activity.onBackPressed(Activity.java:2123) 
at com.swipemaster.activities.CommonActivity.onBackPressed(CommonActivity.java:16) 
at com.swipemaster.activities.MainActivity.access$0(MainActivity.java:1) 
at com.swipemaster.activities.MainActivity$1.run(MainActivity.java:62) 
at android.os.Handler.handleCallback(Handler.java:605) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4424) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) 
at dalvik.system.NativeStart.main(Native Method) 

測試在Android 4.0.4和2個設備:索尼的Xperia MT27i和ST23i。在2.2.1和Galaxy Mini上,這個問題不會發生。有誰能夠幫助我?

CommonActivity類:

public class CommonActivity extends Activity 
{ 
    @Override 
    public void onBackPressed() 
    { 
     MusicPlayer.continueMusic = true; 
     super.onBackPressed(); // this is CommonActivity.java:16 
    } 
+0

是它在許多設備上觀察到或只是一些特定的? (我問,因爲我檢查了4.0.4_r1.2和4.0.4_r1.1代碼,並且在FragmentManager.java上沒有代碼:457) – sandrstar

+0

我沒有任何帶有4.0.4的其他設備。索尼Xperia MT27i發生故障。 'FragmentManager'是一個抽象類,代碼在'FragmentManagerImpl'中。 https://github.com/grantland/android-support-v4/blob/master/src/java/android/support/v4/app/FragmentManager.java#L377 –

+0

你是否添加了一些片段並依靠片段backstack?你在做一些活動的onResume()嗎? – sandrstar

回答

1

當您在設備上快速按下2次後退按鈕時,onBackPressed()方法也稱爲2次。這是造成這個問題的原因。

解決方案:

看着你的所有onBackPressed()方法。你有什麼,可能會導致問題,因爲被稱爲2次?例如,這可以是對postDelayed()的調用,這是我的情況。如果是的話,加一個標誌確保您的onBackPressed()身體將只執行一次,儘管後退按鈕的點擊數:

private boolean backAlreadyPressed = false; 

@Override 
public void onBackPressed() 
{ 
    if (backAlreadyPressed) 
    { 
     return; 
    } 
    backAlreadyPressed = true; 

    // old implementation of onBackPressed() 
} 
1

按我的理解,這個問題是在此調用return popBackStackState(mActivity.mHandler, null, -1, 0);在以下功能:

@Override 
public boolean popBackStackImmediate() { 
    checkStateLoss(); 
    executePendingTransactions(); 
    return popBackStackState(mActivity.mHandler, null, -1, 0); 
} 

Android source

所以,真正的問題,因爲我看到它:爲什麼mActivity在該功能(或某個特定於供應商的字段)爲空?

按只觀察到上勁兒的裝置問題的意見,所以我可以建議如下:

  • 驗證其他一些設備上的問題,以檢測它是否是可重複的(因爲在普通的Android 4.0.4在FragmentManager.java:457沒有代碼);
  • 嘗試構建API 15或API 16的應用程序,並檢查問題是否仍然存在;
  • 根據this question的回覆,問題可能在於onDestroy()方法之一;
  • 調查應用程序代碼以確定它的某些部分是否爲所有活動調用finish()或做了一些處理以退出應用程序(例如嘗試處理多次後退作爲退出應用程序);
  • 試着鍛鍊一些hack(例如,處理延遲小的100ms後退)。但是爲此,我建議您確定問題是特定於供應商的,並將其用於Build.MANUFACTURER的檢查;