2017-12-28 36 views
0

onActivityResult (...) 메소드 내의 활동 클래스에서 뷰 페이저 어댑터에 대한 notifyDataSetChanged()를 호출하려고합니다. 일부 장치에서만 "치명적인 예외 : java.lang.IllegalStateException : Activity was destroyed "오류가 발생합니다. 아래는 스택 추적입니다.오류 받기 : viewPager 어댑터에 대해 notifyDataSetChanged를 수행 할 때 "java.lang.IllegalStateException : Activity has destroyed"

Fatal Exception: java.lang.IllegalStateException: Activity has been destroyed 
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1515) 
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638) 
    at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:621) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139) 
    at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:1003) 
    at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2996) 
    at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:279) 
    at com.demo.activities.ActivityMain$1.run(ActivityMain.java:180) 
    at android.os.Handler.handleCallback(Handler.java:751) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6351) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786) 

뷰 페이저에는 단 두 개의 조각 (v4) 만 있습니다. 아래 코드에서 notifyDataSetChanged를 수행하는 라인에서 오류가 발생합니다.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == 100) { 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mViewPager.getAdapter().notifyDataSetChanged(); 
      } 
     }, 1000); 
    }} 

이 예외를 피하기 위해 활동이 여전히 존재하는지 여부를 검사하려면 run 메소드 내부의 검사를 수행해야합니까?

답변

2

지연 또는 콜백에서 인스턴스 변수 또는 컨텍스트에 액세스 할 때마다 먼저 해당 인스턴스가 존재하는지 확인해야합니다. 단편의 활동

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      if(!isFinishing()) 
      mViewPager.getAdapter().notifyDataSetChanged(); 
     } 
    }, 1000); 

들어

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      if(isAdded()) 
      mViewPager.getAdapter().notifyDataSetChanged(); 
     } 
    }, 1000);