用户注销时应用程序崩溃

Application crashing when user signs out

伙计们,我一直在制作这个简单的 Uber 应用程序,每当 Driver LogsOut 我的应用程序崩溃时,因为 getCurrentUser() 方法是 return 空值。但是每当用户 logsOut 我关闭 activity,并且在调用 getCurrentUser() 之前我有这个 if(getApplicationContext()!=null) 应该 return false 因为 activity 被关闭所以它应该防止 getCurrentUser() 被调用。我如何防止它崩溃?我在这里错过了什么?

这是在按钮上单击我注销我的用户的地方

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//some code here

    mLogout=(Button)findViewById(R.id.logout);
            mLogout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    isLoggingOut = true;
                    disconnectDriver();
                    
                    //Signing out user here
                    FirebaseAuth.getInstance().signOut();
                    Intent intent = new Intent(DriverMapActivity.this, MainActivity.class);
                    startActivity(intent);
                    return;
                }
            });
//some code here
}

这就是错误发生的地方

@Override
    //this is going to run whenever the driver location changes
    public void onLocationChanged(Location location) {
        if(getApplicationContext()!=null) {

            mLastLocation = location;
            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
          
            mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            mMap.animateCamera(CameraUpdateFactory.zoomTo(11));

            //
            //This is where the error is happening
            //java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
            
            String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
            
            DatabaseReference refAvailable = FirebaseDatabase.getInstance().getReference("driversAvailable");
            
            DatabaseReference refWorking  = FirebaseDatabase.getInstance().getReference("driversWorking");
            
            GeoFire geoFireAvailable = new GeoFire(refAvailable);
           
            GeoFire geoFireWorking = new GeoFire(refWorking);
      
            switch(customerId){
               
                case "":

                   geoFireWorking.removeLocation(userId);
                    geoFireAvailable.setLocation(userId, new GeoLocation(location.getLatitude(), location.getLongitude()));
                    break;
                default:

                   
                    geoFireAvailable.removeLocation(userId);
                    geoFireWorking.setLocation(userId, new GeoLocation(location.getLatitude(), location.getLongitude()));
                    break;

            }
        }
    }

这是错误日志

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.jonanako.uber, PID: 15522
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
        at com.jonanako.uber.DriverMapActivity.onLocationChanged(DriverMapActivity.java:211)
        at com.google.android.gms.internal.location.zzat.notifyListener(com.google.android.gms:play-services-location@@18.0.0:2)
        at com.google.android.gms.common.api.internal.ListenerHolder.zaa(com.google.android.gms:play-services-base@@18.0.1:2)
        at com.google.android.gms.common.api.internal.zacb.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
当你 finish() Activity 时,

getApplicationContext() 不会是 null,即使是最后一个或唯一一个。考虑使用 if(!isFinishing())、生命周期检查或设置自己的 boolean 标志。

此外,您还可以(应该)检查 getCurrentUser() returns null,这意味着用户已注销。如果是 null 那么不要在返回的对象上调用任何方法(因为实际上什么都没有返回)

if(!isFinishing() && FirebaseAuth.getInstance().getCurrentUser()!=null) {

由于每次单击按钮时都将 false 分配给 isLoggingOut = true;,因此您应该只检查 if(getApplicationContext()!=null && !isLoggingOut),这样代码就不会 运行 每当 isLoggingOut==false;