2017-04-13 19 views
0

レルムを制御するベースアクティビティがフラグメントのアクティビティを拡張するときに、レルムをフラグメントで処理する方法が混乱します。NullPointerExceptionを引き起こすフラグメントのレルム

Base Activity -> User Activity -> Base Fragment -> Fragment

すべては私が活動を終了するまで、正常に動作します(つまり、以前の活動に戻る):

言い換えれば、私はこのような構造を持っています。私はこのエラーを取得する:

java.lang.RuntimeException: Unable to destroy activity {UserActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.realm.Realm.close()' on a null object reference

...

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.realm.Realm.close()' on a null object reference at BaseFragment.onDestroyView

は私の基本活動:

public abstract class BaseActivity extends AppCompatActivity { 
    private Realm realm; 

    protected abstract int getLayoutResource(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(getLayoutResource()); 

     realm = Realm.getDefaultInstance(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     realm.close(); 
    } 

    public Realm getRealm() { 
     return realm; 
    } 
} 

が私の主な活動(フラグメントが作成される場所):

public class UserActivity extends BaseActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String type = getIntent().getStringExtra("type"); 

     Fragment fragment = null; 
     if (findViewById(R.id.fragment_container) != null) { 
      if (savedInstanceState != null) { 
       return; 
      } 

      if (type.equals("first")) { 
       fragment = new FirstFragment(); 
      } else if (type.equals("second")) { 
       fragment = new SecondFragment(); 
      } 

      getSupportFragmentManager().beginTransaction() 
        .add(R.id.fragment_container, fragment).commit(); 
     } 
    } 

    @Override 
    protected int getLayoutResource() { 
     return R.layout.activity_user; 
    } 
} 

そして、私のフラグメントの全てがベースフラグメントを拡張します。ここに私のベースですフラグメント:

public abstract class BaseFragment extends Fragment { 

    private Realm realm; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     realm = Realm.getDefaultInstance(); 

     return inflater.inflate(getFragmentLayout(), container, false); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     realm.close(); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
       public void execute(Realm realm) { 
        // some realm operation 
       } 
     }); 
    } 

    protected abstract int getFragmentLayout(); 
} 

何が問題なのですか?私はRealmを不適切に管理していますか?

+0

superメソッドの前にrealm.close()を呼び出してみてください。 – aProperFox

+0

NPEはまだ怪しいです。 :/ – user656217

答えて

0

あなたの活動を破壊するときにあなたのBaseFragmentrealm.close();を取り除きます。そのため、あなたはNPEを2回閉じることになります。したがって、フラグメント内のrealm.close();を削除し、アクティビティを閉じる処理をRealmにします。

関連する問題