2012-03-13 72 views
2

我試圖做使用的ApplicationContext在助手級


我試圖創建一個登錄其在Helperclass完全處理,以保持代碼的簡潔。

爲此,我創建了一個具有我需要的所有功能的helperclass,現在問題是我總是得到一個NullPointer-Exception,可能是因爲getApplicationContext

問題


所以我需要做什麼在我的代碼更改爲得到這個工作。代碼如下所示。如果你有一個很好的教程或者其他東西,請提供給我。我真的很喜歡我自己做這個。

代碼


LoginActivity.class

package de.ivocore; 


public class LoginActivity extends Activity { 

    private DBAdapter mDbHelper; 

    private LoginHelper login = new LoginHelper(); 



    **/ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 

     mDbHelper = new DBAdapter(this); 
     mDbHelper.open(); 
     mDbHelper.close(); 

     // Text-Felder 
     final EditText user = (EditText) findViewById(R.id.edt_username); 
     final EditText pwd = (EditText) findViewById(R.id.edt_password); 

     // Button 
     Button loginbt = (Button) findViewById(R.id.bt_login); 

     // OnClickListner für den Button definieren 
     loginbt.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 

       // Eingegebener Username und Passwort auslesen 
       final String usertxt = user.getText().toString(); 
       final String pwdtxt = pwd.getText().toString(); 
       Log.d("User", usertxt); 
       Log.d("PWD", pwdtxt); 

       checkLoginData(usertxt, pwdtxt); 
      } 
     }); 

    } 

public void checkLoginData(final String username, final String password){ 

    boolean user, pass; 

    if (username.length() < 6){ 
     user = false; 
    }else { 
     user = true; 
    } 

    if (password.length() < 6){ 
     pass = false; 
    }else { 
     pass = true; 
    } 

    int val = 0; 
    if (user) val |= 0x1; 
    if (pass) val |= 0x2; 

    switch (val){ 
    case 0: 
     login.loginFalse(getApplicationContext(),"Username und Passwort müssen mindestens 6 Zeichen haben"); 

    break; 

    case 1: 
     login.loginFalse(getApplicationContext(),"Passwort muss mindestens 6 Zeichen haben"); 
    break; 

    case 2: 
     login.loginFalse(getApplicationContext(),"Username muss mindestens 6 Zeichen haben"); 
    break; 

    case 3: 
     login.doLogin(getApplicationContext(),username, password); 
    } 

} 
} 

LoginHelper.class

package de.ivocore.firstboot; 


public class LoginHelper { 

    private static final String PREFS_NAME = "de.ivocore.firstboot.PREF_NAME"; 
    private static final String PREFS_USER = "de.ivocore.firstboot.PREF_USER"; 
    private static final String PREF_FIRSTBOOT = "de.ivocore.firstboot.FIRSTBOOT"; 

    ProgressDialog progressDialog; 
    private static SharedPreferences mPrefs; 
    boolean first; 
    Context test; 

    // Handlet die Message aus dem Thread 
    private Handler handler = new Handler() { 

     public void handleLogin(Message msg) { 

      switch(msg.what){ 
      case 0: { 
       progressDialog.dismiss(); 
       Intent i = new Intent(test, MainActivity.class); 
       test.startActivity(i); 

      } break; 

      case 1:{ 
       progressDialog.dismiss(); 
       String text = "Username oder Passwort inkorrekt"; 
       loginFalse(test, text); 
      } break; 
     } 

     } 
    }; 

    /** 
    * Hier wird ein AlertDialog erzeugt welcher zurück gibt ob was am Login 
    * falsch war. 
    * 
    * @param ctx 
    *   Context der Klasse 
    * @param text 
    *   Text der ausgegeben werden soll 
    */ 
    public void loginFalse(Context ctx, String text) { 

     AlertDialog alertDialog; 
     alertDialog = new AlertDialog.Builder(ctx) 
       .setMessage(text) 
       .setTitle("Login inkorrekt") 
       .setCancelable(true) 
       .setNeutralButton(android.R.string.cancel, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int whichButton) { 
          } 
         }).show(); 
    } 

    public void doLogin(final Context ctx, final String username, 
      final String password) { 

     progressDialog = ProgressDialog.show(ctx, "Login", "Bitte warten..."); 

     Thread t = new Thread() { 
      @Override 
      public void run() { 

       String URL = "http://LOGINURL (NotForYourEyes)" 

       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpResponse response; 


       try { 
        //Firstboot überprüfung 

        HttpPost post = new HttpPost(URL); 
        StringEntity se = new StringEntity("username=" + username 
          + "&password=" + password); 
        post.setEntity(se); 
        post.addHeader("Content-Type", 
          "application/x-www-form-urlencoded"); // Dieser 
                    // Header is 
                    // von curl 
                    // -d Befehl 
                    // abgeleitet 
        response = client.execute(post); 

        int statuscode = response.getStatusLine().getStatusCode(); 

        switch (statuscode) { 

        case 200: 

         if (response != null) { 

          StringBuilder sb = new StringBuilder(); 
          BufferedReader rd = new BufferedReader(
            new InputStreamReader(response.getEntity() 
              .getContent())); 

          String line; 
          while ((line = rd.readLine()) != null) { 
           sb.append(line + "\n"); 
          } 

          String result; 
          result = sb.toString(); 

          // User-Id auslesen 
          final String uid; 
          JSONObject holder = new JSONObject(result); 
          uid = holder.getString("id"); 
          Log.d("JSON-Response", uid); 

          String token = "test-token"; 


          SharedPreferences logindata = ctx.getSharedPreferences(PREFS_USER, 0); 
          SharedPreferences.Editor editor = logindata.edit(); editor.clear(); 
          editor.putString("userid", uid); 
          editor.putString("token", token); 
          editor.commit(); 


          handler.sendEmptyMessage(0); 
         } 
         break; 

        case 500: 

         handler.sendEmptyMessage(1); 

         break; 

        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
        Log.e("DataHandler", "URLConnection-Error" + e); 
       } 
      } 
     }; 
     t.start(); 
    } 

    /** 
    * Mit dieser Methode wird heraussgesucht ob der erste Login bereits 
    * geschehen ist 
    * 
    * @return firstboot 
    */ 
    private boolean getFirstboot() { 
     boolean firstboot = mPrefs.getBoolean(PREF_FIRSTBOOT, first); 
     return firstboot; 
    } 

    /** 
    * Hier wird die Variabel auf true gesetzt, falls der Firstboot bereits 
    * passiert ist. 
    * 
    * @param first 
    */ 
    private static void setFirstboot(boolean first) { 
     mPrefs.edit().putBoolean(PREF_FIRSTBOOT, first).commit(); 
    } 

} 

的logcat:

03-14 08:12:53.464: E/AndroidRuntime(9462): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:519) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.app.Dialog.show(Dialog.java:274) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.app.AlertDialog$Builder.show(AlertDialog.java:932) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at de.ivocore.firstboot.LoginHelper.loginFalse(LoginHelper.java:80) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at de.ivocore.LoginActivity.checkLoginData(LoginActivity.java:120) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at de.ivocore.LoginActivity$1.onClick(LoginActivity.java:92) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.view.View.performClick(View.java:3480) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.view.View$PerformClick.run(View.java:13983) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.os.Handler.handleCallback(Handler.java:605) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.os.Looper.loop(Looper.java:137) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at android.app.ActivityThread.main(ActivityThread.java:4340) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-14 08:12:53.464: E/AndroidRuntime(9462):  at dalvik.system.NativeStart.main(Native Method) 

如果您需要更多代碼或更詳細的信息,請將其寫入下面的評論中。

+0

問題,你可以發表你的NPE的logcat的?如果你只用'this'作爲上下文怎麼辦? – zapl 2012-03-13 16:40:19

+0

你在哪裏定義loginHelper?看起來像無處... – 2012-03-13 16:43:34

+0

我做了私人LoginHelper登錄; – safari 2012-03-13 16:46:16

回答

1
getApplicationContext(); 

對於對話框或任何其他UI更改函數,您必須將其從您的活動中傳遞。

getApplicationContext()只能在不涉及UI時使用(加載資源,prefs,..等)。

+0

好,我能做些什麼比得到上下文?並把它交給我的幫手類? – safari 2012-03-14 07:25:58

+0

而不是調用login.loginFalse(getApplicationContext(),...) 只是調用login.loginFalse(this,...) 活動實現上下文 – MahdeTo 2012-03-14 07:27:07

+0

告訴我,誰是誰的prittier之一。 – safari 2012-03-14 07:29:23

0

嘗試初始化LoginHelper。在當前的代碼中,它將是空的。

+0

好吧,這樣做,現在我得到一個新的異常'03 -14 08:12:53.464:E/AndroidRuntime(9462):android.view.WindowManager $ BadTokenException:無法添加窗口 - 標記null不適用於應用程序' – safari 2012-03-14 07:14:06

1

試試這個

View view = LayoutInflater.from(getParent()).inflate(
      R.layout.login, null); 
    setContentView(view); 

我修好了我自己的這個