2017-02-24 137 views
0

我上的getuid收到错误()错误的Android火力显示java.lang.NullPointerException

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

,这我的活动代码:

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(); 
    } 
} 
+0

CheckUserExist(); mAuth.addAuthStateListener(mAuthListener);调用此行调用CheckUserExist();在mAuth.addAuthStateListener(mAuthListener)之后; –

+0

仍然得到相同的错误@ZakiPathan – Ragils

+0

张贴您的错误@Ragils –

回答

0

那是因为你没有初始化毛特。 除去OnStart方法和复制的代码的onCreate。在OnCreate将

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


    } 
+0

仍然得到相同的错误@CodFather – Ragils

1

问题发生在你试图调用mAuth.getCurrentUser().getUid()。显然当时没有当前用户,因此呼叫失败。

而是使用:

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) { 

     } 
    }); 
    } 
} 

一般情况下,你需要使用一个auth状态侦听器,对于这一点,类似于你已经在onCreate之一。

事实上,在我看来,这两个可以很容易地折叠成一个单一的监听器:一个开始,如果用户没有登录的登录活动和可选地与数据库中注册用户,如果他们。

操作的代码:

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

} 

我也是固定的,你检查,如果用户在数据库中已存在的方式。检索所有用户那么如果一个键存在客户端检查是带宽的浪费,将成为作为你的用户数量的增长尤其明显。我写的代码会精确检查数据库中是否存在此用户的UID,这是您可以检查的最小数据。

+0

这是工作..非常感谢你:) – Ragils

+1

好听。如果我回答了您的问题,请点击复选标记以接受它。这样别人就知道你已经(充分)帮助了。 –

相关问题