getUid()给出空指针异常

时间:2017-07-29 13:09:52

标签: android nullpointerexception firebase-authentication

由于getUid()空指针异常,我的应用程序崩溃。

这是MainActivity。如果数据库中没有用户,则用户被定向到登录页面。如果用户尝试登录并且他/她之前没有签名(不存在),然后他/她被引导到设置Intent。据我所知,用户一旦登录就不会永远登录。这就是getUid返回null的原因吗?如何解决? 以下是代码:

package com.awani.pocketblog;

import android.app.Activity;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
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.Picasso;

import org.w3c.dom.Text;

import java.util.Set;

import static android.app.PendingIntent.getActivity;

public class MainActivity extends AppCompatActivity {

private RecyclerView mBlogList;
private DatabaseReference mDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference mDatabaseUsers;
private DatabaseReference mDatabaseLike;
private boolean mProcessLike = false;
private DatabaseReference mDatabaseCurrentUser;//to retrieve data from the current user.
private Query mQueryCurrentUser;


@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 there is no user signed in,go to loginIntent    if(FirebaseAuth.getInstance().getCurrentUser()==null)
            {
                Intent loginIntent = new Intent(MainActivity.this,LoginActivity.class);
                loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(loginIntent);
            }

        }
    };

    mBlogList = (RecyclerView) findViewById(R.id.blog_list);
    mBlogList.setHasFixedSize(true);
    mBlogList.setLayoutManager(new LinearLayoutManager(this));
    mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog");
    mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");
    mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes");

    //problem is with the following statement:
    String currentUserID = mAuth.getCurrentUser().getUid();
    mDatabaseCurrentUser = FirebaseDatabase.getInstance().getReference().child("Blog");

    mQueryCurrentUser = mDatabaseCurrentUser.orderByChild("uid").equalTo(currentUserID);

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

//check if the user trying to login exists or not
    checkUserExist();
}

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

    mAuth.addAuthStateListener(mAuthListener);
//set adpter for recyclerview
    FirebaseRecyclerAdapter<Blog,BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(
            Blog.class,
            R.layout.blog_row,
            BlogViewHolder.class,
            mQueryCurrentUser

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

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

            viewHolder.setTitle(model.getTitle());//model means Blog class over here
            viewHolder.setDesc(model.getDesc());
            viewHolder.setUsername(model.getUsername());

            viewHolder.setLikeButton(post_key);
            viewHolder.setImage(getApplicationContext(),model.getImage());
            //mView is reference for the whole view
            viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    Intent singleBlogIntent =new Intent(MainActivity.this,BlogSingleActivity.class);
                    singleBlogIntent.putExtra("blog_id",post_key);
                   // singleBlogIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(singleBlogIntent);


                }
            });


            viewHolder.mLikeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    mProcessLike = true;

                        mDatabaseLike.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {

                                if (mProcessLike) {

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

                                        mDatabaseLike.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();

                                        mProcessLike = false;


                                    } else {
                                        mDatabaseLike.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue("Random value");
                                       mProcessLike = false;
                                    }

                                }

                            }
                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }


            });

        }

    };


    mBlogList.setAdapter(firebaseRecyclerAdapter);
}

private void checkUserExist() {

    //retrieving UID

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

        //check if the user with this UID already  exists
        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) {

            }
        });

    }
}

//holder for the recyclerView
public static class BlogViewHolder extends RecyclerView.ViewHolder{


    View mView;
    ImageButton mLikeButton;
    DatabaseReference mDatabaseLike;
    FirebaseAuth mAuth;

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

        mView = itemView;

        mLikeButton = (ImageButton)mView.findViewById(R.id.like_button);

        mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes");

        mAuth = FirebaseAuth.getInstance();
        mDatabaseLike.keepSynced(true);


    }

    public void setLikeButton(final String post_key){


        mDatabaseLike.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

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

                    mLikeButton.setImageResource(R.drawable.ic_thumb_up_red_400_24dp);

                }else{
                    mLikeButton.setImageResource(R.mipmap.ic_thumb_up_black_24dp);
                }


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }

    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_description = (TextView) mView.findViewById(R.id.post_description);
        post_description.setText(desc);
    }

    public void setUsername(String username){
        TextView post_username = (TextView)mView.findViewById(R.id.post_username);
        post_username.setText(username);

    }

    public void setImage(Context ctx,String image){
        ImageView post_image = (ImageView)mView.findViewById(R.id.post_image);
        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();

}
}

1 个答案:

答案 0 :(得分:0)

错误的一行是:

String currentUserID = mAuth.getCurrentUser().getUid();

您需要先测试当前用户是否存在:

FirebaseUser user = mAuth.getCurrentUser();

if (user != null) {
    String currentUserID = user.getUid();

    // Use currentUserID 
}

Firebase User documentation.