0

I'm building a chat app with firebase and when I press the logout button the app stops and the error is NullPointerException:

attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference at com.example.aplicatieatestat.Adapter.UserAdapter$2.onDataChange(UserAdapter.java:131)

and I can't figure it out.

Here is the UserAdapter Code, hope it helps


import android.content.Context;
import android.content.Intent;
import android.media.Image;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.example.aplicatieatestat.MessageActivity;
import com.example.aplicatieatestat.Model.Chat;
import com.example.aplicatieatestat.Model.User;
import com.example.aplicatieatestat.R;
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.ValueEventListener;

import java.util.List;

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {

    private Context mContext;
    private List<User> mUser;
    private boolean isactive;

    String last_message;

    public UserAdapter(Context mContext, List<User> mUser, boolean isactive) {
        this.mUser = mUser;
        this.mContext = mContext;
        this.isactive = isactive;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.user_item, parent, false);

        return new UserAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        final User user = mUser.get(position);
        holder.username.setText(user.getUsername());
        if (user.getImageURL().equals("default")) {
            holder.profilepic.setImageResource(R.mipmap.ic_launcher);
        } else {
            Glide.with(mContext).load(user.getImageURL()).into(holder.profilepic);

        }

        if (isactive){
            last_msg_check(user.getId() , holder.last_msg);
        }
        else {
            holder.last_msg.setVisibility(View.GONE);
        }

        if (isactive) {
            if (user.getStatus().equals("online")) {
                holder.img_on.setVisibility(View.VISIBLE);
                holder.img_off.setVisibility(View.GONE);
            } else {
                holder.img_off.setVisibility(View.VISIBLE);
                holder.img_on.setVisibility(View.GONE);
            }
        } else {
            holder.img_off.setVisibility(View.GONE);
            holder.img_on.setVisibility(View.GONE);
        }

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, MessageActivity.class);
                intent.putExtra("userid", user.getId());
                mContext.startActivity(intent);
            }
        });

    }

    @Override
    public int getItemCount() {
        return mUser.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView username;
        public ImageView profilepic;
        private ImageView img_on;
        private ImageView img_off;
        private TextView last_msg;

        public ViewHolder(View itemView) {
            super(itemView);

            username = itemView.findViewById(R.id.username);
            profilepic = itemView.findViewById(R.id.profile_image);
            img_on = itemView.findViewById(R.id.img_online);
            img_off = itemView.findViewById(R.id.img_offline);
            last_msg = itemView.findViewById(R.id.last_message);
        }
    }
    private void last_msg_check(final String userid, final TextView last_msg) {
        last_message = "default";
        final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Chats");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                    Chat chat = dataSnapshot1.getValue(Chat.class);
                    assert chat != null;
                    assert firebaseUser != null;
                    if (chat.getReceiver().equals(firebaseUser.getUid()) && chat.getSender().equals(userid) || chat.getReceiver().equals(userid) && chat.getSender().equals(firebaseUser.getUid())) {

                        last_message = chat.getMessage();

                    }
                }

                if (last_message == "default") {
                    last_msg.setText(" ");



                } else {
                    last_msg.setText(last_message);
                }

                last_message = "default";
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }

        });
    }
}

And here is the main activity :

package com.example.aplicatieatestat;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.aplicatieatestat.Fragments.ChatsFragment;
import com.example.aplicatieatestat.Fragments.ProfileFragment;
import com.example.aplicatieatestat.Fragments.UsersFragment;
import com.example.aplicatieatestat.Model.User;
import com.google.android.material.circularreveal.CircularRevealLinearLayout;
import com.google.android.material.tabs.TabLayout;
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.ValueEventListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;

import de.hdodenhof.circleimageview.CircleImageView;

public class MainActivity extends AppCompatActivity {

   CircleImageView profilepic;
   TextView username;

   FirebaseUser firebaseUser;
   DatabaseReference reference;


   @Override
   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       Toolbar toolbar = findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       Objects.requireNonNull(getSupportActionBar()).setTitle("");


       profilepic = findViewById(R.id.profile_image);
       username = findViewById(R.id.username);

       firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
       reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

       reference.addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
               User user = dataSnapshot.getValue(User.class);
               assert user != null;
               username.setText(user.getUsername());
               if (user.getImageURL().equals("default")) {
                   profilepic.setImageResource(R.mipmap.ic_launcher);
               } else {
                   Glide.with(getApplicationContext()).load(user.getImageURL()).into(profilepic);
               }

           }

           @Override
           public void onCancelled(@NonNull DatabaseError databaseError) {

           }
       });

       TabLayout tabLayout = findViewById(R.id.tab_layout);
       ViewPager viewPager = findViewById(R.id.view_pager);

       ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());

       viewPagerAdapter.addFragment(new ChatsFragment(), "Chats");
       viewPagerAdapter.addFragment(new UsersFragment(), "Users");
       viewPagerAdapter.addFragment(new ProfileFragment(), "Profile");


       viewPager.setAdapter(viewPagerAdapter);

       tabLayout.setupWithViewPager(viewPager);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
       getMenuInflater().inflate(R.menu.menu, menu);
       return true;
   }

   @Override
   public boolean onOptionsItemSelected(@NonNull MenuItem item) {
       if (item.getItemId() == R.id.logout) {
           FirebaseAuth.getInstance().signOut();
           startActivity(new Intent(MainActivity.this, StartActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
           finish();
           return true;
       }
       return false;
   }

class ViewPagerAdapter extends FragmentPagerAdapter {

       private ArrayList<Fragment> fragments;

       private ArrayList<String> titles;

       ViewPagerAdapter(FragmentManager fragmentManager){
       super(fragmentManager);
       this.fragments = new ArrayList<>();

       this.titles = new ArrayList<>();

       }



   @NonNull
   @Override
   public Fragment getItem(int position) {
       return fragments.get(position);
   }

   @Override
   public int getCount() {
       return fragments.size();
   }

   public void addFragment(Fragment fragment, String title)
   {
       fragments.add(fragment);
       titles.add(title);
   }

   @Nullable
   @Override
   public CharSequence getPageTitle(int position) {
       return titles.get(position);
   }
}

private  void  status(String status){
       reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

   HashMap<String, Object> hashMap = new HashMap<>();
   hashMap.put("status", status);

   reference.updateChildren(hashMap);

}

   @Override
   protected void onResume() {
       super.onResume();
       status("online");
   }

   @Override
   protected void onPause() {
       super.onPause();
       status("offline");
   }
}

Thanks in advance for your answers!

Nikos Hidalgo
  • 3,666
  • 9
  • 25
  • 39
Ianis Teja
  • 11
  • 1
  • just a quick glance over your code makes me say: learn the basics of Java first, before trying to make apps. if (last_message == "default") this will lead to wrong results. use equals to compare the values of objects. – Stultuske Mar 11 '20 at 10:40
  • You need remove all ValueEventListener after logout .. Also add a null check on user inside onDataChange just to be sure.. – ADM Mar 11 '20 at 10:41
  • @Stultuske No need to be so discouraging. A lot of people learn as they go. Also depending on the situation (if OP, for example, is a student) this is the only way to learn. Also, not all objects need to use the _.equals()_. It's true in this case, but your comment reads more condescending than helpful. – Nikos Hidalgo Mar 11 '20 at 10:44
  • @NikosHidalgo let's say you see someone building a house, and they start immediately with the walls and roof, but didn't build a foundation, do you consider it to be condescending to point out that having a foundation first might come in handy? "A lot of people learn as they go", yes, as is with everything. But you don't learn to walk by running a marathon. First you learn to walk, then to run, then to run long distance, and only then you can consider running a marathon. – Stultuske Mar 11 '20 at 10:55
  • @Stultuske Your advice is good, and it applies in most cases. Maybe I misread the tone with which you wrote it. Also in context, it felt more condescending. But I apologise if that wasn't your intention. – Nikos Hidalgo Mar 11 '20 at 10:58
  • sometimes advice seems so. Then again, if you check the number of times we check code that comes from a production-ready codebase just to find errors like this, it's an advice instructors should give more often. People tend to rush learning, and skip over very important parts, which will lead to "silly" problems later on. – Stultuske Mar 11 '20 at 11:00

0 Answers0