2016-02-21 40 views
0

我已经创建了一个应用程序,你可以登录使用SQLite,并检查匹配用户数据库。- 空对象引用

我有登录工作,我知道了一个布尔变量设置为true,一旦用户登录,但我试图找出如何从传回MainActivity.java Login.java的onResume()方法。

下面是从代码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; 
    } 

logcat的

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) 

回答

1

如果你需要在其他活动使用这个会话!您需要再次发送!所以,我建议使用sharedprefrences和存储您的凭证(会话),何地,你,从共享获取会话,并用它

1

您正在寻找不会在那里,如果你的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,最好将键提取为常量并引用它们,而不是对它们进行硬编码。这是一个更好的编码练习,可以避免潜在的恶意错误。

+0

三江源,这确实让很多更有意义。但是,当我使用getBooleanExtra它说:“方法getBooleanExtra(字符串,布尔)类型意图不适用于参数(字符串)” –

+0

@MattMurphy这是我的不好。 'getBooleanExtra()'方法要求你传入你想要接收的默认值,以防未额外设置。请看我更新的答案。 –

1

为什么要在你的onResume()中调用super.onRestart()?既然你调用了这个方法,那么就不会有额外的,这就是为什么你得到一个空指针。将super.onRestart()行更改为super.onResume()。

此外,根据您的情况,你可能想的布尔存储在sharedpreferences而不是将它来回你的活动之间。