1

MySQL データベースで Json を使用して Android ログイン アプリケーションを作成しようとしていますが、それを実行してログインしようとすると、次のエラーが発生します。

11-22 12:29:08.079: E/AndroidRuntime(731): FATAL EXCEPTION: main
11-22 12:29:08.079: E/AndroidRuntime(731): java.lang.NullPointerException
11-22 12:29:08.079: E/AndroidRuntime(731):  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
11-22 12:29:08.079: E/AndroidRuntime(731):  at com.example.loctrans.DBConnection.DBConnection(DBConnection.java:41)
11-22 12:29:08.079: E/AndroidRuntime(731):  at com.example.loctrans.MainActivity.onClick(MainActivity.java:56)
11-22 12:29:08.079: E/AndroidRuntime(731):  at android.view.View.performClick(View.java:4084)
11-22 12:29:08.079: E/AndroidRuntime(731):  at android.view.View$PerformClick.run(View.java:16966)
11-22 12:29:08.079: E/AndroidRuntime(731):  at android.os.Handler.handleCallback(Handler.java:615)
11-22 12:29:08.079: E/AndroidRuntime(731):  at android.os.Handler.dispatchMessage(Handler.java:92)
11-22 12:29:08.079: E/AndroidRuntime(731):  at android.os.Looper.loop(Looper.java:137)
11-22 12:29:08.079: E/AndroidRuntime(731):  at android.app.ActivityThread.main(ActivityThread.java:4745)
11-22 12:29:08.079: E/AndroidRuntime(731):  at java.lang.reflect.Method.invokeNative(Native Method)
11-22 12:29:08.079: E/AndroidRuntime(731):  at java.lang.reflect.Method.invoke(Method.java:511)
11-22 12:29:08.079: E/AndroidRuntime(731):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-22 12:29:08.079: E/AndroidRuntime(731):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-22 12:29:08.079: E/AndroidRuntime(731):  at dalvik.system.NativeStart.main(Native Method)

コードを検証していたときに、log.e() メソッドを追加して、エラーのある行を見つけました。ここに私のBD接続コードがあります

public class DBConnection extends Activity{
String result =  null;
    InputStream is = null;

public String DBConnection(ArrayList<NameValuePair> nameValuePairs, String URL){

      try{
          Log.e("info error", " fase 2");
          HttpClient httpclient = new DefaultHttpClient();
          Log.e("info error", " fase 3");
          HttpPost httppost = new HttpPost(URL);
          Log.e("info error", " fase 4");
          httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
          Log.e("info error", httppost.toString());
          HttpResponse response = httpclient.execute(httppost);
          Log.e("info error", " fase 6");
          HttpEntity entity = response.getEntity();
          Log.e("info error", " fase 7");
          is = entity.getContent();
          Log.e("info error", " fase 8");
  }catch(Exception e){
      Toast.makeText(getApplicationContext(), "Error in http connection"+e.toString(), Toast.LENGTH_LONG).show();
  }
  //convert response to string
  try{
      Log.e("info error", " fase 9");
          BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
          StringBuilder sb = new StringBuilder();
          Log.e("info error", " fase 10");
          String line = null;
          while ((line = reader.readLine()) != null) {
                  sb.append(line + "\n");
          }
          is.close();
          result=sb.toString();
          Log.e("log_tag", "Cadena JSon " + result);
  }catch(Exception e){
      Toast.makeText(getApplicationContext(), "Error converting result "+e.toString(), 
              Toast.LENGTH_LONG).show();
      Log.e("log_tag", "Error converting result " + e.toString());
  }
  return result;
}

public String getResult(){
    return result;
}

}

logcat には、最初の 3 つの log.e メッセージのみがあります。

11-22 12:29:07.899: E/info error(731):  fase 2
11-22 12:29:07.919: E/info error(731):  fase 3
11-22 12:29:07.929: E/info error(731):  fase 4

問題は次の行にあると思います: httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs) しかし、エラーが正確に何であるかわかりません

メイン アクティビティ コードの一部を次に示します。

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("Login" ,logi));
String URL = "http://192.168.1.10/Android/getlogin.php";          
DBConnection DBC = new DBConnection();
String result = DBC.DBConnection(nameValuePairs, URL);
4

2 に答える 2

1
java.lang.NullPointerException
  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
  at com.example.loctrans.DBConnection.DBConnection(DBConnection.java:41)

LogCat はgetApplicationContext()、Toast に問題があることを報告しますが、これは catch ブロックにあります。本当の問題はあなたの Http コードにあります。おそらく NetworkOnMainThread 例外をスローしています。(Android 3.0 以降を使用していますか?)

低速になる可能性のあるネットワーク操作を別のスレッドで実行する必要があります。カスタム AsyncTask を作成し、コードを に移動するだけですdoInBackground()


DBConnection が Activity を拡張するのはなぜですか? 投稿していないコードでアクティビティのように使用していますか?

于 2012-11-22T18:26:03.770 に答える
0

アクティビティ内では、getApplicationContext() ではなく、コンテキストが必要な場所でキーワードthisを使用する必要があります。

Toast.makeText(this, "Error in http connection"+e.toString(), Toast.LENGTH_LONG).show();

このエラーはこれを指しており、サムが言うように、スレッド UI 内で実行されている HTTP コードに関連する問題があります。すべての HTTP ジョブを実行するには、AsyncTask を使用する必要があります。

http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-11-22T18:35:02.580 に答える