2017-07-29 1 views
-2

Meine App stürzt ab, weil die Nullzeigerausnahme getUid() ist.getUid() gibt null Zeigerausnahme

Dies ist MainActivity.Falls sich kein Benutzer in der Datenbank befindet, wird der Benutzer zur Anmeldeseite geleitet. Wenn der Benutzer versucht, sich anzumelden und er/sie noch nicht angemeldet hat (existiert nicht), dann er/sie ist auf die Setup-Absicht verwiesen.Wie ich weiß, der Benutzer einmal eingeloggt bleibt nicht für immer eingeloggt.Ist es der Grund dafür, dass getUid null zurückgibt? Wie man es löst? folgenden ist der Code:

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(); 

} 
} 

Antwort

0

Die falsche Zeile ist:

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

Sie müssen prüfen, ob der aktuelle Benutzer existieren erste:

FirebaseUser user = mAuth.getCurrentUser(); 

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

    // Use currentUserID 
} 

Firebase User documentation.