Ragils
Ragils

Reputation: 3

Error android firebase java.lang.NullPointerException

I'm getting error on getUid()

final String user_id = mAuth.getCurrentUser().getUid();

and this my activity code :

public class MainActivity extends AppCompatActivity {

    private RecyclerView postList;
    private DatabaseReference mDatabase;
    private DatabaseReference mDatabaseUsers;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAuth = FirebaseAuth.getInstance();
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                if (firebaseAuth.getCurrentUser() == null){
                    Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
                    loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(loginIntent);
                }
            }
        };

        mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog");
        mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");

        mDatabase.keepSynced(true);
        mDatabaseUsers.keepSynced(true);

        postList = (RecyclerView) findViewById(R.id.post_list);
        postList.setHasFixedSize(true);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setReverseLayout(true);
        layoutManager.setStackFromEnd(true);

        postList.setLayoutManager(layoutManager);

    }

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

        CheckUserExist();

        mAuth.addAuthStateListener(mAuthListener);

        FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(

                Blog.class,
                R.layout.post_row,
                BlogViewHolder.class,
                mDatabase

        ) {
            @Override
            protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) {

                viewHolder.setTitle(model.getTitle());
                viewHolder.setDesc(model.getDescription());
                viewHolder.setImage(getApplicationContext(), model.getImage());

            }
        };
        postList.setAdapter(firebaseRecyclerAdapter);

    }
    private void CheckUserExist() {

        final String user_id = mAuth.getCurrentUser().getUid();

        mDatabaseUsers.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (!dataSnapshot.hasChild(user_id)){
                    Intent SetupIntent = new Intent(MainActivity.this, SetupActivity.class);
                    SetupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(SetupIntent);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    public static class BlogViewHolder extends RecyclerView.ViewHolder{

        View mView;

        public BlogViewHolder(View itemView) {
            super(itemView);

            mView = itemView;
        }
        public void setTitle(String title){
            TextView post_title = (TextView) mView.findViewById(R.id.post_title);
            post_title.setText(title);
        }

        public void setDesc(String desc){
            TextView post_desc = (TextView) mView.findViewById(R.id.post_desc);
            post_desc.setText(desc);
        }

        public void setImage(final Context ctx, final String image){
            final ImageView post_image = (ImageView) mView.findViewById(R.id.post_img);
//            Picasso.with(ctx).load(image).into(post_image);
                Picasso.with(ctx).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(post_image, new Callback() {
                    @Override
                    public void onSuccess() {

                    }

                    @Override
                    public void onError() {
                        Picasso.with(ctx).load(image).into(post_image);
                    }
                });
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main_menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getItemId() == R.id.action_add){
            startActivity(new Intent(MainActivity.this, PostActivity.class));
        }

        if (item.getItemId() == R.id.action_logout){
            logout();
        }

        return super.onOptionsItemSelected(item);
    }

    private void logout() {
        mAuth.signOut();
    }
}

Upvotes: 0

Views: 789

Answers (2)

Frank van Puffelen
Frank van Puffelen

Reputation: 598817

The problem happens when you try to call mAuth.getCurrentUser().getUid(). Apparently there is no current user at the time, so that call fails.

Instead use:

private void CheckUserExist() {
  if (mAuth.getCurrentUser() != null) {
    final String user_id = mAuth.getCurrentUser().getUid();

    mDatabaseUsers.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (!dataSnapshot.hasChild(user_id)){
                Intent SetupIntent = new Intent(MainActivity.this, SetupActivity.class);
                SetupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(SetupIntent);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
  }
}

In general, you'll want to use an auth state listener for this, similar to the one you already have in onCreate.

In fact, it seems to me that both could easily be folded into a single listener: one that starts the login activity if the user isn't signed in and optionally registers the user with the database if they are.

The code for that:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog");
    mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");

    mDatabase.keepSynced(true);
    mDatabaseUsers.keepSynced(true);

    postList = (RecyclerView) findViewById(R.id.post_list);
    postList.setHasFixedSize(true);

    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setReverseLayout(true);
    layoutManager.setStackFromEnd(true);

    postList.setLayoutManager(layoutManager);

}

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

    CheckUserExist();

    FirebaseAuth.getInstance().addAuthStateListener(new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user == null){
                // The user is not signed in, start login flow
                Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
                loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(loginIntent);
            }
            else {
                // The user is signed in, register them in database
                String user_id = user.getUid();

                mDatabaseUsers.child(user_id).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (!dataSnapshot.exists()){
                            Intent SetupIntent = new Intent(MainActivity.this, SetupActivity.class);
                            SetupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(SetupIntent);
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException(); // don't ignore onCancelled
                    }
                });
            }
        }
    });

    FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(

            Blog.class,
            R.layout.post_row,
            BlogViewHolder.class,
            mDatabase

    ) {
        @Override
        protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) {

            viewHolder.setTitle(model.getTitle());
            viewHolder.setDesc(model.getDescription());
            viewHolder.setImage(getApplicationContext(), model.getImage());

        }
    };
    postList.setAdapter(firebaseRecyclerAdapter);

}

I also fixed the way you check if the user already exists in the database. Retrieving all users to then client-side check if one of the keys exists is a waste of bandwidth that will become especially evident as your number of users grows. The code I wrote checks precisely whether this user's UID already exists in the database, which is the minimum data you can check.

Upvotes: 1

Kiran Benny Joseph
Kiran Benny Joseph

Reputation: 6813

It is because you are not initializing mauth. remove onstart method and copy the code to oncreate. oncreate will be

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAuth = FirebaseAuth.getInstance();
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                if (firebaseAuth.getCurrentUser() == null){
                    Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
                    loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(loginIntent);
                }
            }
        };

        mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog");
        mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");

        mDatabase.keepSynced(true);
        mDatabaseUsers.keepSynced(true);

        postList = (RecyclerView) findViewById(R.id.post_list);
        postList.setHasFixedSize(true);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setReverseLayout(true);
        layoutManager.setStackFromEnd(true);

        postList.setLayoutManager(layoutManager);
CheckUserExist();

        mAuth.addAuthStateListener(mAuthListener);

        FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(

                Blog.class,
                R.layout.post_row,
                BlogViewHolder.class,
                mDatabase

        ) {
            @Override
            protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) {

                viewHolder.setTitle(model.getTitle());
                viewHolder.setDesc(model.getDescription());
                viewHolder.setImage(getApplicationContext(), model.getImage());

            }
        };
        postList.setAdapter(firebaseRecyclerAdapter);


    }

Upvotes: 0

Related Questions