2017-07-29 96 views
-2

由於getUid()空指針異常,我的應用程序崩潰。getUid()給出空指針異常

這是MainActivity。如果數據庫中沒有用戶,那麼用戶將被引導到登錄頁面。如果用戶嘗試登錄並且他/她之前沒有簽名(不存在),則他/她被引導到設置意圖。據我所知,用戶一旦登錄不會永遠登錄。它是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

錯線是:

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

您需要測試如果當前用戶首先存在:

FirebaseUser user = mAuth.getCurrentUser(); 

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

    // Use currentUserID 
} 

Firebase User documentation.