2017-04-13 93 views
0

当片段的活动扩展了控制领域的基本活动时,我很困惑如何处理片段中的Realm。导致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

尝试在超级方法之前放置realm.close()调用? – aProperFox

+0

仍然导致NPE不幸。 :/ – user656217

回答

0

得到您的BaseFragment摆脱realm.close();那是怎么回事,当你破坏活动,所以你将要关闭它两次,这就是为什么你得到的NPE被关闭。所以如果你删除你的片段中的realm.close();,并让活动句柄关闭Realm

相关问题