Soumya Rauth
Soumya Rauth

Reputation: 1201

App crashes with java.lang.NullPointerException

I wanted to filter all the posts with orderbychild. But the app crashes. After I debug it shows error on :

final String currentUserId=mAuth.getCurrentUser().getUid();  this line of code.

// I tested on one device but it works fine but in two other devices the app crashes

//Here's my error report

java.lang.NullPointerException
                  at com.soumya.uglypeople.MyPosts.onCreateView(MyPosts.java:80)
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                  at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1643)
                  at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
                  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:700)
                  at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
                  at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1364)
                  at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:765)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
                  at android.view.Choreographer.doCallbacks(Choreographer.java:562)
                  at android.view.Choreographer.doFrame(Choreographer.java:532)
                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
                  at android.os.Handler.handleCallback(Handler.java:725)
                  at android.os.Handler.dispatchMessage(Handler.java:92)
                  at android.os.Looper.loop(Looper.java:137)
                  at android.app.ActivityThread.main(ActivityThread.java:5041)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:511)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                  at dalvik.system.NativeStart.main(Native Method)

// And here is my activity code:

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.CallbackManager;
import com.facebook.FacebookSdk;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
import com.firebase.client.Firebase;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Callback;
import com.squareup.picasso.NetworkPolicy;
import com.squareup.picasso.Picasso;


import static android.R.id.list;
import static com.facebook.FacebookSdk.getApplicationContext;
import static com.squareup.picasso.Picasso.with;


public class MyPosts extends Fragment{


    private RecyclerView postList;
    private DatabaseReference mDatabase;
    private DatabaseReference mDatabaseAppriciate;
    private DatabaseReference mDatabaseDisgrace;
    private LinearLayoutManager layoutManager;
    private FirebaseAuth mAuth;
    private DatabaseReference mDatabaseCurrentUser;
    private Query mQueryCurrentUser;


    //private static final String TAG = "MyActivity";

    private boolean mProcessAppriciate=false;
    private boolean mProcessDisgrace=false;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        super.onSaveInstanceState(savedInstanceState);
        View rootView = inflater.inflate(R.layout.allposts, container, false);

        mAuth= FirebaseAuth.getInstance();

        mDatabase= FirebaseDatabase.getInstance().getReference().child("Posts");
        mDatabaseAppriciate=FirebaseDatabase.getInstance().getReference().child("Appriciate");
        mDatabaseDisgrace=FirebaseDatabase.getInstance().getReference().child("Disgrace");

        //Below line shows error
        final String currentUserId=mAuth.getCurrentUser().getUid();
        mDatabaseCurrentUser=FirebaseDatabase.getInstance().getReference().child("Posts");
        mQueryCurrentUser=mDatabaseCurrentUser.orderByChild("uid").equalTo(currentUserId);

        mDatabase.keepSynced(true);
        mDatabaseAppriciate.keepSynced(true);
        mDatabaseDisgrace.keepSynced(true);


        postList=(RecyclerView) rootView.findViewById(R.id.postList);
        postList.setHasFixedSize(true);
        layoutManager=new LinearLayoutManager(getActivity());
        layoutManager.setReverseLayout(true);
        postList.setHasFixedSize(true);
        postList.setLayoutManager(layoutManager);


        postList.getRecycledViewPool().clear();   


        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();


        FirebaseRecyclerAdapter<Posts,PostViewHolder> firebaseRecyclerAdapter= new FirebaseRecyclerAdapter<Posts,PostViewHolder>(

                Posts.class,
                R.layout.single_post,
                PostViewHolder.class,
                mQueryCurrentUser

        ) {

            @Override
            protected void populateViewHolder(final PostViewHolder viewHolder, final Posts model, final int position) {

                final String post_key=getRef(position).getKey();

                viewHolder.setTitle(model.getTitle());
                viewHolder.setDescription(model.getDescription());
                viewHolder.setProfileName(model.getProfilename());
                viewHolder.setImage(getContext(),model.getImage());
                viewHolder.getLayoutPosition();
                viewHolder.setAppriciateButton(post_key);
                viewHolder.setDisgraceButton(post_key);



                //Share click code below
                viewHolder.Share.setOnClickListener(new View.OnClickListener() {

                    CallbackManager callbackManager;
                    ShareDialog shareDialog;
                    @Override
                    public void onClick(View v) {

                        FacebookSdk.sdkInitialize(getApplicationContext());
                        callbackManager = CallbackManager.Factory.create();
                        shareDialog = new ShareDialog(MyPosts.this);
                        if (ShareDialog.canShow(ShareLinkContent.class)) {

                            ShareLinkContent content = new ShareLinkContent.Builder()
                                    .setContentTitle(model.getTitle())
                                    .setContentDescription(model.getDescription())
                                    .setImageUrl(Uri.parse(model.getImage()))
                                    .setContentUrl(Uri.parse("https://developers.facebook.com"))
                                    .build();
                            shareDialog.show(content);

 }

  }

                });

                viewHolder.Appriciate.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mProcessAppriciate=true;



                        mDatabaseAppriciate.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (mProcessAppriciate) {

                                    if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) {
                                        mDatabaseAppriciate.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();

                                        mProcessAppriciate = false;

                                    }else {
                                        mDatabaseAppriciate.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue(mAuth.getCurrentUser().getDisplayName());
                                             viewHolder.Appriciate.setText("APPRICIATED");

                                        mProcessAppriciate = false;


                                    }

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }



                });




                viewHolder.Disgrace.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mProcessDisgrace=true;



                        mDatabaseDisgrace.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (mProcessDisgrace) {

                                    if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) {
                                        mDatabaseDisgrace.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();
//
                                        mProcessDisgrace = false;

                                    } else {
                                        mDatabaseDisgrace.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue(mAuth.getCurrentUser().getDisplayName());
//
                                        mProcessDisgrace = false;


                                    }

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }



                });


                //Disgrace Button Click code Ends

            }

        };

        postList.setAdapter(firebaseRecyclerAdapter);


        //test code
        firebaseRecyclerAdapter.notifyDataSetChanged();

    }


    public static class PostViewHolder extends RecyclerView.ViewHolder{

        View mView;
        Button Appriciate;
        Button Disgrace;
        Button Share;
        DatabaseReference mDatabaseAppriciate;
        DatabaseReference mDatabaseDisgrace;
        FirebaseAuth mAuth;




        public PostViewHolder(View itemView) {
            super(itemView);
            mView=itemView;
            Appriciate=(Button) mView.findViewById(R.id.appriciate);
            Disgrace=(Button) mView.findViewById(R.id.disgraceful);
            Share=(Button) mView.findViewById(R.id.share);


            mDatabaseAppriciate=FirebaseDatabase.getInstance().getReference().child("Appriciate");
            mDatabaseDisgrace=FirebaseDatabase.getInstance().getReference().child("Disgrace");
            mAuth=FirebaseAuth.getInstance();
            mDatabaseAppriciate.keepSynced(true);
            mDatabaseDisgrace.keepSynced(true);


        }

        public void setAppriciateButton(final String post_key){

            mDatabaseAppriciate.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){
                        Appriciate.setBackgroundColor(Color.GRAY);
                        Appriciate.setText("Appriciated");

                    }else{
                        Appriciate.setBackgroundColor(Color.GREEN);
                        Appriciate.setText("APPRICIATE");
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }


        public void setDisgraceButton(final String post_key){

            mDatabaseDisgrace.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){
                        Disgrace.setBackgroundColor(Color.GRAY);
                        Disgrace.setText("Disgraced");

                    }else{
                        Disgrace.setBackgroundColor(Color.RED);

                        Disgrace.setText("DISGRACE");
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }

        public void setTitle(String title){
            TextView postTitle=(TextView) mView.findViewById(R.id.allPostTitle);
            postTitle.setText(title);

        }

        public void setDescription(String description){
            TextView postDescription=(TextView) mView.findViewById(R.id.allPostDescription);
            postDescription.setText(description);
        }

        public void setProfileName(String profilename){
            TextView postName=(TextView) mView.findViewById(R.id.profileName);
            postName.setText(profilename);
        }




        public void setImage(final Context context, final String image) {
            final ImageView postImage=(ImageView) mView.findViewById(R.id.allPostImage);
            with(context).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(postImage, new Callback() {
                @Override
                public void onSuccess() {

                }

                @Override
                public void onError() {



                    Picasso.with(context).load(image).resize(500,700).into(postImage);

                }
            });

        }




    }
}

//Here's build gradle (Module.app)

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE'

    }


    defaultConfig {


        minSdkVersion 17
        targetSdkVersion 24
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'com.android.support:recyclerview-v7:24.2.1'
    compile 'com.android.support:cardview-v7:24.2.1'
    compile 'com.google.firebase:firebase-core:10.0.1'
    compile 'com.google.firebase:firebase-database:10.0.1'
    compile 'com.google.firebase:firebase-storage:10.0.1'
    compile 'com.google.firebase:firebase-auth:10.0.1'
    compile 'com.firebase:firebase-client-android:2.5.2'
    compile 'com.firebaseui:firebase-ui-database:1.0.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    testCompile 'junit:junit:4.12'
    compile 'com.google.android.gms:play-services:10.0.1'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.squareup.okhttp3:okhttp:3.5.0'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
}
apply plugin: 'com.google.gms.google-services'

Upvotes: 0

Views: 760

Answers (2)

Frank van Puffelen
Frank van Puffelen

Reputation: 598668

The problem is that you're synchronously reading the current user, which may return null:

final String currentUserId=mAuth.getCurrentUser().getUid()

When the app starts, the sign-in state of the user may not be known yet. In that case getCurrentUser() will return null, which crashes your code.

To prevent this, you should listen for the authentication state to be confirmed/changed:

FirebaseAuth.getInstance().addAuthStateListener(new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
        }
    }
});

Upvotes: 1

sivaBE35
sivaBE35

Reputation: 1891

The problem is that in firebase when you create a user it doesn't sign in the user.

First check mAuth is null or not then get getUid if not null.

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // User is signed in
    // Get User details 

} else {
    // No user is signed in
    // create new signin 
}

Upvotes: 1

Related Questions