2017-02-08 3 views
0

Meine App stürzt ab, wenn RealmList null ist. Es funktionierte gut, bis ich meinen Emulator von API 23 zu API 19 änderte.Mit RealmChangeListener auf Null prüfen

Ich habe bereits einen Scheck, aber es ist nicht, aber immer noch stürzt ab. Ich habe versucht, dies zu tun

RealmChangeListener realmChangeListener = new RealmChangeListener() { 
@Override 
public void onChange(Object element) { 
    if(getPostsFromDb() != null){ 
     mAdapter.swapData(getPostsFromDb());  
    } 
    } 
}; 

Die App noch mit NPE Absturz

Wie kann ich dieses Problem lösen?

public class CartFragment extends Fragment{ 

private Realm realm; 

private RecyclerView mRecyclerView; 
private BucketFragmentAdapter mAdapter; 
private RecyclerView.LayoutManager mLayoutManager; 

private ProgressBar circularProgessBar; 

private RelativeLayout emptyView; 

RealmChangeListener realmChangeListener = new RealmChangeListener() { 
    @Override 
    public void onChange(Object element) { 
     mAdapter.swapData(getPostsFromDb()); 
    } 
}; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    realm = Realm.getDefaultInstance(); 
    int user_id = Utils.getStoredUser(getActivity()).getId(); 

    BucketListAPIHelper.loadBucket(user_id); 

     realm.addChangeListener(realmChangeListener); 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup vg, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.cart_fragment, vg, false); 

    emptyView = (RelativeLayout) view.findViewById(R.id.empty_view); 

    circularProgessBar = (ProgressBar) view.findViewById(R.id.circular_progress_bar); 

    circularProgessBar.setVisibility(View.VISIBLE); 

    if(isNetworkConnected()){ 
     circularProgessBar.setVisibility(View.GONE); 
    }else{ 
     new AlertDialog.Builder(getActivity()) 
       .setTitle("No Internet Connection") 
       .setMessage("It looks like your a problem with your internet connection. Please turn it " + 
         "on and try again") 
       .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
        } 
       }).setIcon(android.R.drawable.ic_dialog_alert).show(); 
    } 

    loadBucket(view); 

    return view; 
} 


private void loadBucket(View view) { 

    RealmResults<Bucket> realmResults = getPostsFromDb(); 

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
    mRecyclerView.setHasFixedSize(true); 
    mLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(mLayoutManager); 

    if(!realmResults.isEmpty()){ 
     mRecyclerView.setVisibility(View.VISIBLE); 
     emptyView.setVisibility(View.GONE); 
     circularProgessBar.setVisibility(View.GONE); 
     mAdapter = new BucketFragmentAdapter(realmResults, getActivity(), true); 
     mRecyclerView.setAdapter(mAdapter); 

    }else{ 
     mRecyclerView.setVisibility(View.GONE); 
     emptyView.setVisibility(View.VISIBLE); 
    } 

} 


@Subscribe 
public void onPostSuccess(BucketListAPIHelper.PostsInfoSuccess postInfo) { 
    //setRefreshing(false); 
} 

public RealmResults<Bucket> getPostsFromDb() { 
    RealmResults<Bucket> realmResults = realm.where(Bucket.class).findAll(); 
    if(realmResults != null){ 
     return realmResults; 
    } 
    return realmResults; 
} 

/* Present user with some error message when there's an issue while retrieving data */ 
@Subscribe 
public void onPostFailure(BucketListAPIHelper.PostsInfoFailure error) { 
    ///setRefreshing(false); 
    //displaySimpleConfirmSnackBar(recyclerView, error.getErrorMessage()); 
} 


private boolean isNetworkConnected() { 
    ConnectivityManager connMgr = (ConnectivityManager) 
      getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); // 1 
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); // 2 
    return networkInfo != null && networkInfo.isConnected(); // 3 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    EventBusSingleton.unregister(this); 

} 

@Override 
public void onResume() { 
    super.onResume(); 
    EventBusSingleton.register(this); 
} 

@Override 
public void onDestroy() { 

    if (realm != null) { 
     realm.close(); 
    } 

    super.onDestroy(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    } 

} 

Stack Trace

02-08 14:19:58.526 23440-23440/ng.aswitch.shoppar E/dalvikvm: Could not   find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering 
    02-08 14:24:27.126 23440-23440/ng.aswitch.shoppar E/AndroidRuntime: FATAL EXCEPTION: main 
Process: ng.aswitch.shoppar, PID: 23440 
java.lang.NullPointerException 
    at ng.aswitch.shoppar.fragments.CartFragment$1.onChange(CartFragment.java:66) 
    at io.realm.HandlerController.notifyGlobalListeners(HandlerController.java:248) 
    at io.realm.HandlerController.notifyAllListeners(HandlerController.java:323) 
    at io.realm.HandlerController.realmChanged(HandlerController.java:456) 
    at io.realm.HandlerController.handleMessage(HandlerController.java:122) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at  dalvik.system.NativeStart.main(Native Method) 
+0

was die Spur – EpicPandaForce

+0

@EpicPandaForce Stack i die Frage aktualisiert und hinzugefügt Stack-Trace – SimpiMind

Antwort

2

Sie sollten RealmChangeListener zu Realm Instanz in onCreateView() hinzufügen statt onCreate(), und es auch in onDestroyView() entfernen.

Da zur Zeit, wenn onDestroyView() genannt wird, und onDestroy() sind noch nicht genannt, dann, wenn es ein Schreibvorgang in das Reich ist, dann wird RealmChangeListener versuchen mAdapter selbst zu aktualisieren, wenn die Sicht nicht mehr existiert.


Obwohl ich glaube, Ihr eigentliches Problem kommt von der Tatsache, dass

if(!realmResults.isEmpty()){ 
    mRecyclerView.setVisibility(View.VISIBLE); 
    emptyView.setVisibility(View.GONE); 
    circularProgessBar.setVisibility(View.GONE); 
    mAdapter = new BucketFragmentAdapter(realmResults, getActivity(), true); 
    mRecyclerView.setAdapter(mAdapter); 

}else{ 
    mRecyclerView.setVisibility(View.GONE); 
    emptyView.setVisibility(View.VISIBLE); 
} 

wenn RealmResults leer ist, dann mAdapter nicht initialisiert wird, aber wenn es ein Schreibvorgang in das Reich ist, dann RealmChangeListener werden versuchen, um das nicht initialisierte mAdapter zu aktualisieren, was zu Ihrem Absturz führen wird.


Lösung: fügen null Scheck an RealmChangeListener um mAdapter

RealmChangeListener realmChangeListener = new RealmChangeListener() { 
    @Override 
    public void onChange(Object element) { 
     if(mAdapter != null) { 
      mAdapter.swapData(getPostsFromDb()); 
     } 
    } 
}; 
+0

Es funktionierte, ich danke Ihnen sehr. Wie auch immer, das Verhalten hat sich geändert, mein Fragment wird sofort wie zuvor aktualisiert, bis ich das Fragment zu einem anderen Fragment belasse und zu dem Fragment zurückkomme, bevor es sich selbst aktualisiert, was ist der Fix dafür. – SimpiMind

+0

Aufruf 'BucketListAPIHelper.loadBucket (user_id);' in 'onCreateView()' oder 'onViewCreated()' – EpicPandaForce

+0

Ich versuchte beide, immer noch nicht, bis und verlassen und kommen zu dem Fragment zurück, das Fragment nur selbst aktualisieren, wenn ich wahrscheinlich Löschen und Element in der Liste oder löschen Sie die gesamte Liste in diesem Fragment. – SimpiMind