Java 通过firebase google signin检索用户名和电子邮件时调用onResume()时出现空对象引用异常
我正在制作一个android应用程序。我试图在java的文本视图中设置用户的用户名和邮件。当我第一次启动应用程序时,会设置数据,就像我使用google signin登录一样,但当我退出应用程序并尝试再次启动时,它会崩溃,从而产生空对象引用异常。 它不会第二次从以下位置拾取值:Java 通过firebase google signin检索用户名和电子邮件时调用onResume()时出现空对象引用异常,java,android,Java,Android,我正在制作一个android应用程序。我试图在java的文本视图中设置用户的用户名和邮件。当我第一次启动应用程序时,会设置数据,就像我使用google signin登录一样,但当我退出应用程序并尝试再次启动时,它会崩溃,从而产生空对象引用异常。 它不会第二次从以下位置拾取值: mUsername = user.getDisplayName(); 我只有以下MainActivity类: public class MainActivity extends AppCompatActivity
mUsername = user.getDisplayName();
我只有以下MainActivity类:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
public static final String ANONYMOUS = "anonymous";
public static final String EMAIL = "mail@domain.com";
public static final int RC_SIGN_IN = 1;
private String mUsername;
private String mEmail;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mDatabaseReference;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**Add Drawer layout and Navigation view*/
addDrawerLayoutAndNAvigationView();
/**FireBase Authentication Check*/
runFirebaseAuthenticator();
}
private void setUsernameAndMail(String name, String mail) {
TextView username = (TextView) findViewById(R.id.username_text_view);
username.setText(name);
TextView email = (TextView) findViewById(R.id.user_mail_text_view);
email.setText(mail);
}
@Override
protected void onResume() {
super.onResume();
if(mFirebaseAuth!=null){
FirebaseUser user = mFirebaseAuth.getCurrentUser();
onSignedInInitializer(user.getDisplayName(), user.getEmail());
}
mFirebaseAuth.addAuthStateListener(mAuthStateListener);
}
@Override
protected void onPause() {
super.onPause();
if (mAuthStateListener != null) {
mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
}
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.home) {
Intent i = new Intent(this, MainActivity.class);
startActivity(i);
} else if (id == R.id.settings) {
Intent i = new Intent(this, SettingsActivity.class);
startActivity(i);
} else if (id == R.id.signout) {
AuthUI.getInstance().signOut(this);
return true;
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
private void addDrawerLayoutAndNAvigationView() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
private void runFirebaseAuthenticator() {
mUsername = ANONYMOUS;
mEmail = EMAIL;
mFirebaseDatabase = FirebaseDatabase.getInstance();
mFirebaseAuth = FirebaseAuth.getInstance();
mAuthStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
Toast.makeText(MainActivity.this, "You are signed in!", Toast.LENGTH_LONG).show();
onSignedInInitializer(user.getDisplayName(), user.getEmail());
} else {
onSignedOutCleanup();
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setIsSmartLockEnabled(false)
.setAvailableProviders(Arrays.asList(
new AuthUI.IdpConfig.GoogleBuilder().build(),
new AuthUI.IdpConfig.EmailBuilder().build()))
.build(),
RC_SIGN_IN);
}
}
};
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
if (resultCode == RESULT_OK) {
Toast.makeText(MainActivity.this, "Signed In!", Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(MainActivity.this, "Signed Cancelled!", Toast.LENGTH_LONG).show();
finish();
}
}
}
private void onSignedInInitializer(String username, String email) {
mUsername = username;
mEmail = email;
/**Set username and email*/
setUsernameAndMail(mUsername,mEmail);
}
private void onSignedOutCleanup() {
mUsername = ANONYMOUS;
mEmail = EMAIL;
}}
java.lang.RuntimeException: Unable to resume activity {example.com.navdrawer/example.com.navdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3519)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3559)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2807)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1548)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6372)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at example.com.navdrawer.MainActivity.setUsernameAndMail(MainActivity.java:61)
at example.com.navdrawer.MainActivity.onSignedInInitializer(MainActivity.java:188)
at example.com.navdrawer.MainActivity.onResume(MainActivity.java:72)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1270)
at android.app.Activity.performResume(Activity.java:6974)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3496)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3559)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2807)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1548)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6372)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)
然后是nav_header_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
app:srcCompat="@mipmap/ic_launcher_round" />
<TextView
android:id="@+id/username_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:text="@string/username"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
android:id="@+id/user_mail_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/user_mail" />
</LinearLayout>
我无法找到这个问题的解决方案。@nilesh你能给我指出一个这样的解决方案吗,我找不到任何解决方案!按照以下回答@nilesh我想从firebase用户对象中获取用户名。我无法从用户obj将值放入我的“mUsername”变量中。不,问题出在您的
TextView用户名
和TextView电子邮件
中,您需要像这样做findViewById
@nilesh非常感谢!!!它解决了我面临的问题,但我仍然不明白为什么我必须将navigationView放入一个变量,然后查询其他变量。还有为什么显示空对象错误?