2016-05-07 55 views
0

我想知道是否有人可以提供幫助。每次運行我的android應用程序項目時,它都會崩潰。我已經縮小到一個單一的功能,但我不知道爲什麼它崩潰!Android應用程序在運行時崩潰:'java.lang.String android.content.Context.getPackageName()'

ERROR:

05-07 17:38:22.059 3952-3986/com.tfs.adihub W/System: ClassLoader referenced   unknown path: /data/data/com.tfs.adihub/lib 
05-07 17:38:22.122 3952-3952/com.tfs.adihub D/AndroidRuntime: Shutting down  VM 
05-07 17:38:22.123 3952-3952/com.tfs.adihub E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: com.tfs.adihub, PID: 3952 
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tfs.adihub/com.tfs.adihub.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                   at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077) 
                   at android.app.ActivityThread.-wrap15(ActivityThread.java) 
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350) 
                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                   at android.os.Looper.loop(Looper.java:148) 
                   at android.app.ActivityThread.main(ActivityThread.java:5417) 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
                   at android.content.ContextWrapper.getPackageName(ContextWrapper.java:133) 
                   at android.app.Activity.getLocalClassName(Activity.java:5205) 
                   at android.app.Activity.getPreferences(Activity.java:5239) 
                   at com.tfs.adihub.helpers.isLoggedIn(helpers.java:99) 
                   at com.tfs.adihub.MainActivity$override.onCreate(MainActivity.java:35) 
                   at com.tfs.adihub.MainActivity$override.access$dispatch(MainActivity.java) 
                   at com.tfs.adihub.MainActivity.onCreate(MainActivity.java:0) 
                   at android.app.Activity.performCreate(Activity.java:6237) 
                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
                   at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)  
                   at android.app.ActivityThread.-wrap15(ActivityThread.java)  
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)  
                   at android.os.Handler.dispatchMessage(Handler.java:102)  
                   at android.os.Looper.loop(Looper.java:148)  
                   at android.app.ActivityThread.main(ActivityThread.java:5417)  
                   at java.lang.reflect.Method.invoke(Native Method)  
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
05-07 17:38:30.716 3952-3952/com.tfs.adihub I/Process: Sending signal. PID: 3952 SIG: 9 

MainActivity.java:

package com.tfs.adihub; 

import android.content.Intent; 
import android.net.Uri; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

import com.google.android.gms.appindexing.Action; 
import com.google.android.gms.appindexing.AppIndex; 
import com.google.android.gms.common.api.GoogleApiClient; 

public class MainActivity extends AppCompatActivity { 

/** 
* ATTENTION: This was auto-generated to implement the App Indexing API. 
* See https://g.co/AppIndexing/AndroidStudio for more information. 
*/ 
private GoogleApiClient client; 

Button LoginButton, RegisterButton; 

@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final helpers helpers = new helpers(); 
    client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 

    Button LoginButton = (Button) findViewById(R.id.button_login); 
    Button RegisterButton = (Button) findViewById(R.id.button_register); 

    if (helpers.isLoggedIn()) { 
     startActivity(new Intent(MainActivity.this, Dashboard.class)); 
    } 

    RegisterButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivity(new Intent(MainActivity.this, Register.class)); 
     } 
    }); 

    LoginButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivity(new Intent(MainActivity.this, Login.class)); 
     } 
    }); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client.connect(); 
    Action viewAction = Action.newAction(
      Action.TYPE_VIEW, // TODO: choose an action type. 
      "Main Page", // TODO: Define a title for the content shown. 
      // TODO: If you have web page content that matches this app activity's content, 
      // make sure this auto-generated web page URL is correct. 
      // Otherwise, set the URL to null. 
      Uri.parse("http://host/path"), 
      // TODO: Make sure this auto-generated app URL is correct. 
      Uri.parse("android-app://com.tfs.adihub/http/host/path") 
    ); 
    AppIndex.AppIndexApi.start(client, viewAction); 
} 

@Override 
public void onStop() { 
    super.onStop(); 

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    Action viewAction = Action.newAction(
      Action.TYPE_VIEW, // TODO: choose an action type. 
      "Main Page", // TODO: Define a title for the content shown. 
      // TODO: If you have web page content that matches this app activity's content, 
      // make sure this auto-generated web page URL is correct. 
      // Otherwise, set the URL to null. 
      Uri.parse("http://host/path"), 
      // TODO: Make sure this auto-generated app URL is correct. 
      Uri.parse("android-app://com.tfs.adihub/http/host/path") 
    ); 
    AppIndex.AppIndexApi.end(client, viewAction); 
    client.disconnect(); 
} 
} 

Login.Java:

package com.tfs.adihub; 

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.google.android.gms.appindexing.Action; 
import com.google.android.gms.appindexing.AppIndex; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.kosalgeek.asynctask.AsyncResponse; 
import com.kosalgeek.asynctask.PostResponseAsyncTask; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.HashMap; 

import static android.app.PendingIntent.getActivity; 

public class Login extends AppCompatActivity implements AsyncResponse { 

    Button LoginSubmitButton, LoginRegisterButton; 
    EditText LoginEmail, LoginPassword; 
    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    private GoogleApiClient client; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 

     final helpers helpers = new helpers(); 

     final EditText LoginEmail = (EditText) findViewById(R.id.login_email); 
     final EditText LoginPassword = (EditText) findViewById(R.id.login_password); 
     Button LoginSubmitButton = (Button) findViewById(R.id.login_submit); 
     Button LoginRegisterButton = (Button) findViewById(R.id.login_register_button); 

     LoginRegisterButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startActivity(new Intent(Login.this, Register.class)); 
      } 
     }); 

     assert LoginSubmitButton != null; 
     LoginSubmitButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       final Context context = getApplicationContext(); 
       int duration = Toast.LENGTH_SHORT; 

       if (helpers.isEmpty(LoginEmail)) { 
        CharSequence text = "Please enter your email address."; 

        Toast toast = Toast.makeText(context, text, duration); 
        toast.show(); 
       } else { 
        if (helpers.isEmpty(LoginPassword)) { 
         CharSequence text = "Please enter your password."; 

         Toast toast = Toast.makeText(context, text, duration); 
         toast.show(); 
        } else { 
         if (helpers.isValidEmail(LoginEmail)) 
          if (helpers.isValidPassword(LoginPassword)) { 
           HashMap<String, String> postData = new HashMap<String, String>(); 
           postData.put("emailaddress", LoginEmail.getText().toString()); 
           postData.put("password", LoginPassword.getText().toString()); 
           final PostResponseAsyncTask loginTask = new PostResponseAsyncTask(Login.this, postData, new AsyncResponse() { 
            @Override 
            public void processFinish(String s) { 
             JSONObject results = null; 
             String result_status = null; 
             String MID = null; 
             String MT = null; 

             try { 
              results = new JSONObject(s); 
              result_status = results.getString("STATUS"); 
              MID = results.getString("MID"); 
              MT = results.getString("MT"); 
             } catch (JSONException e) { 
              e.printStackTrace(); 
             } 

             if (result_status.equalsIgnoreCase("success")) { 
              SharedPreferences sharedPref = Login.this.getPreferences(Context.MODE_PRIVATE); 
              SharedPreferences.Editor editor = sharedPref.edit(); 
              editor.putString("MID", MID); 
              editor.putString("MTOK", MT); 
              editor.commit(); 
              startActivity(new Intent(Login.this, Dashboard.class)); 
             } else { 
              Context context = getApplicationContext(); 
              int duration = Toast.LENGTH_SHORT; 
              CharSequence text = result_status; 
              Toast toast = Toast.makeText(context, text, duration); 
              toast.show(); 
             } 
            } 
           }); 
           loginTask.execute("http://192.168.1.64/app/test.php"); 
          } else { 
           CharSequence text = "Invalid password."; 

           Toast toast = Toast.makeText(context, text, duration); 
           toast.show(); 
          } 
         else { 
          CharSequence text = "Invalid email address."; 

          Toast toast = Toast.makeText(context, text, duration); 
          toast.show(); 
         } 
        } 
       } 
      } 
     }); 
     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
    } 

    @Override 
    public void processFinish(String s) { 

    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     client.connect(); 
     Action viewAction = Action.newAction(
       Action.TYPE_VIEW, // TODO: choose an action type. 
       "Login Page", // TODO: Define a title for the content shown. 
       // TODO: If you have web page content that matches this app activity's content, 
       // make sure this auto-generated web page URL is correct. 
       // Otherwise, set the URL to null. 
       Uri.parse("http://host/path"), 
       // TODO: Make sure this auto-generated app URL is correct. 
       Uri.parse("android-app://com.tfs.adihub/http/host/path") 
     ); 
     AppIndex.AppIndexApi.start(client, viewAction); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 

     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     Action viewAction = Action.newAction(
       Action.TYPE_VIEW, // TODO: choose an action type. 
       "Login Page", // TODO: Define a title for the content shown. 
       // TODO: If you have web page content that matches this app activity's content, 
       // make sure this auto-generated web page URL is correct. 
       // Otherwise, set the URL to null. 
       Uri.parse("http://host/path"), 
       // TODO: Make sure this auto-generated app URL is correct. 
       Uri.parse("android-app://com.tfs.adihub/http/host/path") 
     ); 
     AppIndex.AppIndexApi.end(client, viewAction); 
     client.disconnect(); 
    } 
} 

Helpers.Java:

package com.tfs.adihub; 

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.text.TextUtils; 
import android.util.Patterns; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.google.android.gms.appindexing.Action; 
import com.google.android.gms.appindexing.AppIndex; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.kosalgeek.asynctask.AsyncResponse; 
import com.kosalgeek.asynctask.PostResponseAsyncTask; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.HashMap; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* Created by Offic on 03/05/2016. 
*/ 
public class helpers extends AppCompatActivity implements AsyncResponse { 

    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    private GoogleApiClient client; 

    boolean isEmpty(EditText etText) { 
     return etText.getText().toString().trim().length() <= 0; 
    } 

    public boolean isValidEmail(EditText email) { 
     if (TextUtils.isEmpty(email.getText())) { 
      return false; 
     } else { 
      return Patterns.EMAIL_ADDRESS.matcher(email.getText()).matches(); 
     } 
    } 

    public boolean isValidPassword(EditText password) { 
     String regExpn = "^[a-z0-9_]{6,24}$"; 
     CharSequence inputStr = password.getText(); 
     Pattern pattern = Pattern.compile(regExpn, Pattern.CASE_INSENSITIVE); 
     Matcher matcher = pattern.matcher(inputStr); 

     if (matcher.matches()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    private boolean verifySession(String MID, String MTOK) { 
     HashMap<String, String> postData = new HashMap<String, String>(); 
     postData.put("MID", MID); 
     postData.put("MTOK", MTOK); 
     final Boolean[] Ret = {false}; 
     final PostResponseAsyncTask loginTask = new PostResponseAsyncTask(this, postData, new AsyncResponse() { 
      @Override 
      public void processFinish(String s) { 
       JSONObject results = null; 
       String result_status = null; 

       try { 
        results = new JSONObject(s); 
        result_status = results.getString("STATUS"); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

       if (result_status == "success") { 
        Ret[0] = true; 
       } else { 
        Ret[0] = false; 
       } 
      } 
     }); 
     loginTask.execute("http://192.168.1.64/app/test.php"); 

     return Ret[0]; 
    } 

    public boolean isLoggedIn() { 
     SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE); 
     String MID = sharedPref.getString("MID", null); 
     String MT = sharedPref.getString("MTOK", null); 

     if (MID == null || MT == null) { 
      return false; 
     } else { 
      return verifySession(MID, MT); 
     } 
    } 

    @Override 
    public void processFinish(String s) { 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     client.connect(); 
     Action viewAction = Action.newAction(
       Action.TYPE_VIEW, // TODO: choose an action type. 
       "helpers Page", // TODO: Define a title for the content shown. 
       Uri.parse("http://host/path"), 
       Uri.parse("android-app://com.tfs.adihub/http/host/path") 
     ); 
     AppIndex.AppIndexApi.start(client, viewAction); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     Action viewAction = Action.newAction(
       Action.TYPE_VIEW, // TODO: choose an action type. 
       "helpers Page", // TODO: Define a title for the content shown. 
       // TODO: If you have web page content that matches this app activity's content, 
       // make sure this auto-generated web page URL is correct. 
       // Otherwise, set the URL to null. 
       Uri.parse("http://host/path"), 
       // TODO: Make sure this auto-generated app URL is correct. 
       Uri.parse("android-app://com.tfs.adihub/http/host/path") 
     ); 
     AppIndex.AppIndexApi.end(client, viewAction); 
     client.disconnect(); 
    } 
} 

任何幫助將不勝感激!我對這門語言非常非常陌生,所以我仍然在思考它是如何工作的。

非常感謝

回答

2

您的設計存在一個主要缺陷。錯誤是顯而易見的。在這一行

final helpers helpers = new helpers(); 

你試圖創建一個活動的對象,這是一個非常非常糟糕的做法。你不能簡單地創建一個像這樣的活動的對象。 Android中的所有活動必須經歷活動生命週期,以便它們具有附加的有效上下文。在這種情況下,有效的上下文不會附加到幫助程序實例。因此,結果行

SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE); 

導致空指針爲'this'爲空。 (爲什麼?因爲這是指尚未創建的上下文,因爲活動未使用startActivity(intent)啓動)

另一件事,雖然這不是錯誤,但您必須使用以上案件信。遵循慣例,將使您的代碼更具可讀性。由於使用了大寫和小寫名字,你的代碼很混亂。你用小寫字母聲明你的班級,而在某些地方,這些變量是大寫字母。造成混亂。規則是類,接口等應該以小寫字母和變量作爲小寫字母開頭。

所以在這種情況下你會怎麼做?

你永遠不會開始你的助手活動,我認爲你不需要展示給用戶。那就是需要在沒有用戶交互的情況下做一些工作。你應該把它變成一項服務。然後使用startService(intent).啓動它或者您也可以將它創建爲Java類,具體取決於您的用例。

編輯:順便說一句,我回答了another類似的問題有同樣的問題,但今天晚些時候涉及服務。

+1

非常感謝你向我解釋。現在我有機會使用知識來找到答案。我擔心有人會發布答案,我會卡在想知道如何以及爲什麼修復它,哪裏出了問題。根據你的回答,我會再次啓動這個項目,並在修改它們以遵守你的文章之後使用這個片段。再次感謝@varunkr –

+0

@JamesP樂於幫助! – varunkr