2012-01-02 93 views
0

我想實例化一個類,它將處理所有的SharedPreferences數據,但我得到NullPointerException。活動中的類實例獲取NullPointerException

以上是LogCat輸出。

01-02 14:24:52.234: E/AndroidRuntime(2599): FATAL EXCEPTION: main 
01-02 14:24:52.234: E/AndroidRuntime(2599): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.app.android.myapp/com.my.app.android.myapp.MyAppAppActivity}: java.lang.NullPointerException 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.os.Looper.loop(Looper.java:123) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at java.lang.reflect.Method.invoke(Method.java:507) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at dalvik.system.NativeStart.main(Native Method) 
01-02 14:24:52.234: E/AndroidRuntime(2599): Caused by: java.lang.NullPointerException 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:100) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at com.my.app.android.myapp.MyAppAppActivity.<init>(MyAppAppActivity.java:9) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at java.lang.Class.newInstanceImpl(Native Method) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at java.lang.Class.newInstance(Class.java:1409) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565) 
01-02 14:24:52.234: E/AndroidRuntime(2599):  ... 11 more 

主要活動:

package com.my.app.android.myapp; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.Toast; 

public class MyAppAppActivity extends Activity { 
    private Login login = new Login(getApplicationContext()); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Intent i; 

     super.onCreate(savedInstanceState); 

     // Temos um token? 
     if (login.checkLogin()) { 
      // Mapa 
      i = new Intent(this, MyAppMapActivity.class); 
      Toast.makeText(this, "Logado", Toast.LENGTH_LONG).show(); 
     } else { 
      // Login 
      i = new Intent(this, MyAppLoginActivity.class); 
      Toast.makeText(this, "Não logado", Toast.LENGTH_LONG).show(); 
     } 

     // Inicia a atividade 
     startActivity(i); 
    } 
} 

登錄類:

package com.my.app.android.myapp; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

public class Login { 
    private static final String APP_SHARED_PREFS = "com.my.app.android.myapp"; 
    private SharedPreferences prefs; 
    private Editor editor; 
    private Context __context; 

    public Login(Context context) { 
     // Salva o contexto 
     __context = context; 

     // Acessa as preferencias 
     this.prefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); 
     this.editor = this.prefs.edit(); 
    } 

    public void logout() { 
     // Remove o token salvo nas preferencias 
     editor.putString("token_auth", ""); 
     editor.commit(); 

     // Chama a tela de login 
     Intent i = new Intent(__context, MyAppAppActivity.class); 
     __context.startActivity(i); 
    } 

    public boolean checkLogin() { 
     if (prefs.getString("token_auth", "") != "") { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void setToken(String token) { 
     editor.putString("token_auth", token); 
     editor.commit(); 
    } 

    public String getToken() { 
     return prefs.getString("token_auth", ""); 
    } 
} 

如果你有什麼事,只問。

謝謝。

回答

1

試試下面的代碼代替你的代碼

public class MyAppAppActivity extends Activity { 
    private Login login ; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent i; 
    login = new Login(getApplicationContext()); 

    // Temos um token? 
    if (login.checkLogin()) { 
     // Mapa 
     i = new Intent(this, MyAppMapActivity.class); 
     Toast.makeText(this, "Logado", Toast.LENGTH_LONG).show(); 
    } else { 
     // Login 
     i = new Intent(this, MyAppLoginActivity.class); 
     Toast.makeText(this, "Não logado", Toast.LENGTH_LONG).show(); 
    } 

    // Inicia a atividade 
    startActivity(i); 
} 
    } 

與mContext更換您的上下文變量_context

+0

繼續同樣的問題... – 2012-01-02 18:03:40

+0

編輯答案現在再試.... – AAnkit 2012-01-02 18:15:26

+0

一件事,如果問題仍然存在,,刪除以前再次登錄並重新登錄... – AAnkit 2012-01-02 18:16:25

1

嘗試移動super調用是你在打電話的onCreate(第一件事);

super.onCreate(savedInstanceState); 
Intent i; 

編輯:試試這個:

private Login login; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent i; 
     login = new Login(getApplicationContext()); 
+0

我已經這樣做了,但錯誤仍然存​​在...我在下面發佈的LogCat輸出。 – 2012-01-02 18:36:48

+0

@ Danniel-magno查看我的編輯 – sfratini 2012-01-02 18:56:17

+1

謝謝,我不得不改變我實例化對象的方式。 – 2012-01-02 19:21:10