java - 从另一个活动中获取数据正在给出 RuntimeException
问题描述
在我的菜单屏幕中,用户必须使用他们的 Google 帐户登录才能使用我的应用程序。成功登录后,用户将进入个人资料屏幕,其中将显示他们的姓名、电子邮件和 Gmail 个人资料图片。
在我的 Profile 类中,在onCreate
方法内部,我有这段代码:
Intent dataFromMain = getIntent();
String fullName = dataFromMain.getExtras().getString("name");
String user_email = dataFromMain.getExtras().getString("email");
String profile_pic = dataFromMain.getExtras().getString("img_url");
Name.setText(fullName);
Username.setText(user_email);
Glide.with(this).load(profile_pic).into(Prof_Pic);
基本上,它从 Menu 类(姓名、电子邮件和个人资料图片 URL)中获取数据,并能够使用这些数据在个人资料屏幕上设置用户的姓名、显示他们的电子邮件并显示他们的 Gmail 个人资料图片。当我第一次登录时,这一切都很好。
但是,我的应用顶部有一个导航栏。假设用户进入游戏屏幕,然后返回个人资料屏幕。该应用程序崩溃,这就是我得到的:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: app.debata.com.debata, PID: 11783
java.lang.RuntimeException: Unable to start activity ComponentInfo{app.debata.com.debata/app.debata.com.debata.Profile}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
at app.debata.com.debata.Profile.onCreate(Profile.java:84)
at android.app.Activity.performCreate(Activity.java:7183)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
当我尝试返回配置文件屏幕时,为什么我的应用程序崩溃了?我相信我在哪里使用getExtras()
和getString()
方法导致了问题。
编辑:在菜单活动中包括显示数据如何发送的方法。
private void handleResult(GoogleSignInResult result) {
if(result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
String name = account.getDisplayName();
String email = account.getEmail();
String img_url = account.getPhotoUrl().toString();
Intent intent = new Intent(this, Profile.class);
intent.putExtra("name", name);
intent.putExtra("email", email);
intent.putExtra("img_url", img_url);
startActivityForResult(intent, 1);
}
}
解决方案
首先,null
在将值发送到intent.
检查日志之前检查值是否获得所有值。
private void handleResult(GoogleSignInResult result) {
if (result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
String name = account.getDisplayName();
String email = account.getEmail();
String img_url = account.getPhotoUrl().toString();
Log.e("my_tag", "name = " + (!TextUtils.isEmpty(name) ? name : "")); // check name is null
Log.e("my_tag", "email = " + (!TextUtils.isEmpty(email) ? email : "")); // check email is null
Log.e("my_tag", "img_url = " + (!TextUtils.isEmpty(img_url) ? img_url : "")); // check img_url is null
// Check null value first and then startactivity
if (!TextUtils.isEmpty(name) &&
!TextUtils.isEmpty(email) &&
!TextUtils.isEmpty(img_url)) {
Intent intent = new Intent(this, Profile.class);
intent.putExtra("name", name);
intent.putExtra("email", email);
intent.putExtra("img_url", img_url);
startActivityForResult(intent, 1);
} else {
Toast.makeText(getApplicationContext(), "One of the values getting null", Toast.LENGTH_SHORT).show();
}
}
}
推荐阅读
- mongodb-compass - 使用 MongoDB Compass 编辑数据时未发布更改流
- angular - 我无法在 primeNg Angular6 多选下拉菜单中设置选择限制
- google-maps-api-3 - 从 GAPI 获取 RefererNotAllowedMapError 而定义的限制模式似乎与引用 URL 匹配
- angular - p-accordionTab 在点击不同的锚标签时打开扭曲的 UI
- php - 文本框数组中的值未更新
- r - R中的chart.Bar()不能获取动物园对象
- javascript - Angular 7 Web 应用程序中的 watsapp 共享
- javascript - 如何保存有关功能的信息以供以后使用?
- java - 从最后一个字符开始并向后迭代 3
- postgresql - 访问 postgreSQL 中的子 json 元素