簡體   English   中英

Android Java-無法銷毀活動:IndexOutOfBoundsException

[英]Android Java - Unable to destroy activity: IndexOutOfBoundsException

每當我關閉應用程序時,都會出現以下錯誤:

FATAL EXCEPTION: main
  Process: uk.cal.codename.projectnedry, PID: 24450
  java.lang.RuntimeException: Unable to destroy activity {uk.cal.codename.projectnedry/uk.CompanyScope.CompanyNavigationActivity.CompanyNavigationActivity}: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
      at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4203)
      at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4221)
      at android.app.ActivityThread.-wrap6(ActivityThread.java)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1538)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:154)
      at android.app.ActivityThread.main(ActivityThread.java:6119)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
   Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
      at java.util.ArrayList.set(ArrayList.java:427)
      at android.support.v4.app.FragmentManagerImpl.makeInactive(FragmentManager.java:1662)
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1452)
      at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
      at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:2951)
      at android.support.v4.app.FragmentController.dispatchDestroy(FragmentController.java:271)
      at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:390)
      at android.support.v7.app.AppCompatActivity.onDestroy(AppCompatActivity.java:209)
      at uk.genericmodelviewpresenter.GenericMvpActivity.onDestroy(GenericMvpActivity.java:96)
      at uk.CompanyScope.CompanyNavigationActivity.CompanyNavigationActivity.onDestroy(CompanyNavigationActivity.java:523)
      at android.app.Activity.performDestroy(Activity.java:6881)
      at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1153)
      at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4190)
      at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4221) 
      at android.app.ActivityThread.-wrap6(ActivityThread.java) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1538) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:154) 
      at android.app.ActivityThread.main(ActivityThread.java:6119) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

接觸我編寫的代碼的唯一部分是:

CompanyNavigation活動:

@Override
public void onDestroy() {
    super.onDestroy();
    getSpecificImpOfGenericPresenter().closeRealm();
}

及其超類GenericMvpActivity:

@Override
public void onDestroy() {
    super.onDestroy();
    //Unbind Butterknife bindings
    if(mUnbinder!=null) {
        mUnbinder.unbind();
    }
}

通過查看stacktrace,我可以看到它與片段相關,但這在Android代碼中。 該CompanyNavigationActivity有時確實包含許多片段, 但是無論是否創建它們都會發生錯誤

關於原因是什么?

編輯1

presenter類中的closeRealm方法僅刪除監聽器並關閉realm的presenters實例。

public void closeRealm() {
    this.mRealmDatabase.getInstance().removeAllChangeListeners();
    this.mRealmDatabase.close();
}

編輯2

經過進一步測試,似乎如果我在CompanyNavigationActivity中的viewpager中創建片段, 則不會發生此錯誤。 它似乎僅在活動中不存在任何片段時發生。

編輯3

我將其范圍縮小為一種特定的方法,該方法正在啟動前台服務。 更具體地說,startService調用。

     /**
     * If foreground location service is not running, start it
     */
    private void startLocationService() {
        if (!ForegroundLocationService.IS_SERVICE_RUNNING) {
            Intent service = new Intent(getSpecificImpOfGenericView().getApplicationContext(), ForegroundLocationService.class);
            service.setAction(ServiceConstants.ACTION.STARTFOREGROUND_ACTION);
            ForegroundLocationService.IS_SERVICE_RUNNING = true;
            getSpecificImpOfGenericView().getApplicationContext().startService(service);
        }
    }

當然,前台請求應該作為單獨的服務保留在前台中,並且不影響啟動它們的活動的破壞嗎?

您應該在super.onDestroy();之前完成所有工作super.onDestroy(); 在銷毀實例特定資源可能依賴的超類資源之前,請先銷毀實例特定資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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