【问题标题】:Getting Data From Another Activity Is Giving RuntimeException从另一个活动中获取数据正在给出 RuntimeException
【发布时间】:2018-12-24 06:00:34
【问题描述】:

在我的菜单屏幕中,用户必须使用他们的 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);
        }
    }

【问题讨论】:

  • 请说明,你将如何在另一个活动中传递数据
  • 发布您从菜单屏幕发送数据的代码。确认您没有从中发送空数据。
  • 在获取值之前检查空指针异常,使用: if (getIntent()!=null &&getIntent().getExtras()!=null){ }
  • @RumitPatel 我在帖子底部的菜单屏幕中添加了代码,以显示数据是如何发送的。
  • @ShubhamVala 检查我帖子底部的菜单代码。

标签: java android android-studio android-intent


【解决方案1】:

试试这个

Intent dataFromMain = getIntent();
String fullName = dataFromMain.getStringExtra("name");
String user_email = dataFromMain.getStringExtra("email");
String profile_pic = dataFromMain.getStringExtra("img_url");

Name.setText(fullName);
Username.setText(user_email);
Glide.with(this).load(profile_pic).into(Prof_Pic);

【讨论】:

  • 当我从游戏屏幕返回菜单屏幕时,头像、电子邮件和用户全名不再可见。它消失了。
  • @BertHanz 请在日志中检查您是否从 google 登录结果或空白中获得了姓名和其他文件。
  • 第一次进入个人资料界面时没有空数据。只有当我尝试刷新个人资料屏幕,或转到另一个屏幕并返回个人资料屏幕时,应用才会崩溃。
  • @BertHanz 我已经理解你的问题,但我仍然需要澄清,所以你可以为你的流程添加代码以便我可以给出适当的解决方案。
【解决方案2】:

首先,检查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();
        }
    }
}

【讨论】:

  • 感谢您的帮助,但您的回答无效。我认为正在发生的事情是当我从游戏屏幕转到个人资料屏幕时,它会破坏前一个屏幕并重新开始。这就是应用程序崩溃的原因,它无法从菜单屏幕获取数据,因为它已被破坏。我现在需要做的是学习如何在从游戏屏幕回到配置文件屏幕时恢复活动。但是如何恢复多个活动的活动?
  • 好的。你应该使用startActivityForResult。看看this question.
猜你喜欢
  • 2012-10-22
  • 2018-11-17
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多