用户在模拟器中单击注销时应用程序崩溃

问题描述 投票:0回答:0

我对 Android Studio 和 Java 都很陌生。当用户单击“注销”时,我当前开发的应用程序崩溃了。我已经多次编辑我的代码。我现在不知道。我希望能得到编程天才的帮助。

这是我的抽屉菜单代码:

package com.example.sample_app;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.navigation.NavigationView;
import com.google.firebase.FirebaseApp;
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;

public class MainActivity  extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private DrawerLayout drawer;

    private FirebaseUser user;
    private DatabaseReference reference;

    private String userID;

    private TextView EmailTxtView, UIDTxtView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sliding_nav);

        // Initialize Firebase
        FirebaseApp.initializeApp(this);
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);

        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
                R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        drawer.addDrawerListener(toggle);
        toggle.syncState();

        // Get the header view from the NavigationView
        View headerView = navigationView.getHeaderView(0);

        //Initialised the parameter for Firebase
        user = FirebaseAuth.getInstance().getCurrentUser();
        reference = FirebaseDatabase.getInstance().getReference("Users");
        userID = user.getUid();

        // Find the TextViews by their IDs
        EmailTxtView = headerView.findViewById(R.id.email_username);
        UIDTxtView = headerView.findViewById (R.id.uid);

        reference.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                User userProfile = snapshot.getValue(User.class);

                if (userProfile != null) {

                    String email = userProfile.email;
                    String UID = userProfile.username;

                    EmailTxtView.setText(email);
                    UIDTxtView.setText(UID);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();
        if (itemId == R.id.tracking) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FragmentTracking()).commit();
        } else if (itemId == R.id.profile) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FragmentProfile()).commit();
        } else if (itemId == R.id.settings) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FragmentSetting()).commit();
        } else if (itemId == R.id.logout) {
            Intent intent = new Intent(MainActivity.this,LoginUser.class);
//            intent.putExtra("LOGOUT", true);
            startActivity(intent);
            finish();
        }
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

}

The image shows drawer with logout, when user click on it. the app crash.

这是错误消息。

E  FATAL EXCEPTION: main
Process: com.example.sample_app, PID: 18145
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sample_app/com.example.sample_app.LoginUser}: com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance.
    at com.google.firebase.database.FirebaseDatabase.assertUnfrozen(FirebaseDatabase.java:332)
    at com.google.firebase.database.FirebaseDatabase.setPersistenceEnabled(FirebaseDatabase.java:285)
    at com.example.sample_app.LoginUser.onCreate(LoginUser.java:37)
    at android.app.Activity.performCreate(Activity.java:7009)
    at android.app.Activity.performCreate(Activity.java:7000)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

只有当用户开始按下注销然后应用程序崩溃时,其他选择的片段才能正常工作

我也尝试过“startActivity(new Intent())”方法,但还是一样。

谢谢你,非常感谢你的努力。如果您想了解有关错误的更多详细信息,请告诉我

我试过这个:

public class MyApp extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
        
        // Enable Firebase database persistence
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    }
}

//I have set this in my login screen

这是因为错误消息确实提到了 setPersistenceEnabled() 我应该删除那个或任何其他措施吗?

java android android-studio crash start-activity
© www.soinside.com 2019 - 2024. All rights reserved.