2017-02-24 6 views
0

私は(GETUID上のエラーを取得しています)エラーアンドロイドfirebase java.lang.NullPointerExceptionが

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

と、この私の活動のコードは:あなたがMauthのを初期化されていないため、

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

はまだ同じエラーを取得します私はすべての活動/コードを投稿するかどうか、その活動についてエラーを表示しますか? – Ragils

+0

があなたのエラーログ –

答えて

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

     } 
    }); 
    } 
} 

は、あなたがこのために認証状態リスナーを使用したいと思う、あなたはすでにonCreateで持っているものに似ています。

実際には、両方とも簡単に1つのリスナーに折り畳むことができます。つまり、ユーザーがログインしていない場合はログインアクティビティを開始し、必要に応じてユーザーをデータベースに登録します。

そのためのコード:

@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

お会いできてよかったです。私があなたの質問に答えたなら、それを受け入れるためにチェックマークをクリックしてください。そうすれば、他の人はあなたが(十分に)助けられたことを知ることができます。 –

関連する問題