登录后在类之间使用会话变量 - 空对象引用



我创建了一个应用程序,您可以在其中使用SQLite登录,它会检查数据库中是否有匹配的用户。

我已经让登录工作,并且一旦用户登录,我就可以将布尔变量设置为 true,但我正在尝试弄清楚如何从 Login.javaonResume() 方法中将其传递回 MainActivity.java。

这是来自Login.java的代码,我将会话设置为true,然后使用putExtra将其发送回MainActivity。

public void onClick(View v) {
                String username = usernameET.getText().toString();
                String password = passwordET.getText().toString();  
                boolean success = db.Login(username, password);       
                if(success)
                {
                    Log.d("login", "user logged");                  
                    session = true;                     
                    Intent i = new Intent(Login.this, MainActivity.class);
                    i.putExtra("loginSuccess", session);
                    i.putExtra("sessionName", username);
                    startActivity(i);
                }
                else
                {
                    Log.d("login", "user not logged");
                }
            }

这是 MainActivity 的代码.java在 onResume() 方法中。if 语句是错误所在,我只想知道如何让我的应用程序识别布尔值,以便它在返回主页时知道用户已登录,并存储用户名,以便我可以根据登录者加载用户的信息。

protected void onResume() {
    super.onRestart();
    Log.d("On Restart", "ON RESTART CALLED");
    boolean sessionBool = false;
    if (sessionBool = getIntent().getExtras().getBoolean("loginSuccess"))
    {
        sessionBool = true;
        String sessionNamestring = getIntent().getStringExtra("sessionName");
        Log.d("Session Name", sessionNamestring);
    }
    else
    {
        sessionBool = false;
    }

日志猫

02-21 00:54:29.174: E/AndroidRuntime(2563): FATAL EXCEPTION: main
02-21 00:54:29.174: E/AndroidRuntime(2563): Process: com.example.project, PID: 2563
02-21 00:54:29.174: E/AndroidRuntime(2563): java.lang.RuntimeException: Unable to resume activity {com.example.project/com.example.project.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Bundle.getBoolean(java.lang.String)' on a null object reference
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2989)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3020)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.ActivityThread.access$800(ActivityThread.java:151)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.os.Handler.dispatchMessage(Handler.java:102)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.os.Looper.loop(Looper.java:135)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.ActivityThread.main(ActivityThread.java:5257)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at java.lang.reflect.Method.invoke(Native Method)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at java.lang.reflect.Method.invoke(Method.java:372)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
02-21 00:54:29.174: E/AndroidRuntime(2563): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Bundle.getBoolean(java.lang.String)' on a null object reference
02-21 00:54:29.174: E/AndroidRuntime(2563):     at com.example.project.MainActivity.onResume(MainActivity.java:64)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
02-21 00:54:29.174: E/AndroidRuntime(2563):     at android.app.Activity.performResume(Activity.java:6076)
如果您需要在其他

活动中使用此会话怎么办!您将需要再次通过额外发送它!因此,我建议使用共享权限并存储您的凭据(会话)以及无论您在哪里,从共享中获取会话并使用它

为什么要在 onResume() 中调用 super.onRestart()?由于您正在调用此方法,因此不会有额外的内容,这就是您获得空指针的原因。将 super.onRestart() 行更改为 super.onResume()。

此外,根据您的情况,您可能希望将布尔值存储在共享首选项中,而不是在您的活动之间来回传递布尔值。

如果您的MainActivity已由启动器启动,则您正在寻找的附加功能将不存在。您需要将逻辑重组为以下内容:

final Intent intent = getIntent();
if (intent.hasExtra("loginSuccess")) {
    final loginSuccess = intent.getBooleanExtra("loginSuccess", false);
    // proceed with your logic, based on the extracted value
}

这样,您就不会尝试访问意图附加功能(如果未设置),从而避免 NPE。

其他一些建议:

  • 如果您的MainActivity开始Login,然后Login将信息发送回MainActivity,您可能需要考虑使用startActivityForResult()

  • 当您通过 Intent extras 传递数据时,最好将键提取为常量并引用它们,而不是对它们进行硬编码。这是一种更好的编码实践,可以使您免于潜在的令人讨厌的错误。

最新更新