2012-11-22 48 views
1

我试图创建使用JSON与MySQL数据库的机器人登录应用程序,但是当我运行它,并尝试登录,我收到以下错误:的Android的Json应用程序错误

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中只有前三个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(新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); 

回答

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

的logcat的报告问题是在祝酒词getApplicationContext(),但在猫ch块。你是对的real问题在于你的Http代码,它可能是抛出了一个NetworkOnMainThread异常。 (您是否使用Android 3.0+?)

您需要在不同的线程中执行可能较慢的网络操作。只需创建一个自定义的AsyncTask并将您的代码移动到doInBackground()


为什么DBConnection扩展Activity?您是否像使用代码中的活动一样使用它,但您尚未发布?

+0

感谢您的帮助,我想要使用的AsyncTask 我使用的是Android 4.1 为DBConnection的只是在我已经发布了代码中使用,所以我没有把它扩大来自Activity。 – sara

0

在活动内部,您应该使用关键字您需要上下文而不是getApplicationContext()。

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

这个错误是指这个,并且像Sam说的那样,在线程UI中运行的HTTP代码有问题。您需要使用AsyncTask来完成您的所有HTTP作业。

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

+0

使用'this'也不行。 Toast在Activity的构造函数中被调用,而不是'onCreate()'方法,并且Activity正在用'new DBConnection()'开始...... sara的当前方法有很多错误。 – Sam

+1

我很困惑,因为这个方法不喜欢构造函数... public String DBConnection ... – dougcunha

+0

好的,它是一种方法。这是一个可怕的做法:方法名称应该以小写字母开头,不应该与班级共享同名... – Sam