由于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();
}
}
答案 0 :(得分:0)
错误的一行是:
String currentUserID = mAuth.getCurrentUser().getUid();
您需要先测试当前用户是否存在:
FirebaseUser user = mAuth.getCurrentUser();
if (user != null) {
String currentUserID = user.getUid();
// Use currentUserID
}