2015-10-19 124 views
0

我对android开发的新东西,我不知道我错过了什么让代码工作。尝试创建登录应用程序。使用dataoutputstream接收数据或发送数据的方式会有问题吗?有没有更好的方式,不被弃用和复杂。寻找最简约易懂的解决方案。Android发送数据到php并接收问题nullpointerexception

不要在后台代码

@Override 
protected Boolean doInBackground(String... params) { 


    DataOutputStream printout; 
    HttpURLConnection urlConn; 
    BufferedReader reader; 
    URL url; 
    String json; 
    JSONObject jObj; 


    //send POST login details to server 
    try { 
     url = new URL(SERVER_ADDRESS + "login.php"); 
     urlConn = (HttpURLConnection) url.openConnection(); 
     urlConn.setRequestMethod("POST"); 
     urlConn.setDoOutput(true); 
     urlConn.setRequestProperty("Accept-Charset", "UTF-8"); 
     urlConn.setReadTimeout(10000); 
     urlConn.setConnectTimeout(15000); 

     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put("username", params[0]); 
     map.put("password", params[1]); 

     StringBuilder sb = new StringBuilder(); 
     for(HashMap.Entry<String, String> e : map.entrySet()){ 
      if(sb.length() > 0){ 
       sb.append("&"); 
      } 
      sb.append(URLEncoder.encode(e.getKey(), "UTF-8")).append("=").append(URLEncoder.encode(e.getValue(), "UTF-8")); 
     } 


     String loginDetails = sb.toString(); 

     printout = new DataOutputStream(urlConn.getOutputStream()); 
     printout.writeBytes(loginDetails); 
     printout.flush(); 
     printout.close(); 

     reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); 
     StringBuilder sb2 = new StringBuilder(); 
     String result = null; 
     while((result=reader.readLine())!=null) { 
      sb2.append(result + '\n'); 
      Log.d("Results", sb2.toString()); 
     }; 

     json = result.toString(); 

     jObj = new JSONObject(json); 

     JSONLogin = jObj.getBoolean(TAG_LOGINSTATUS); 
     Log.d("LoginStatus!!!!", JSONLogin.toString()); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (ProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     Log.d("JsonConvertion", "FAILED TO CONVERT JSON"); 
    } 


    return JSONLogin; 
} 

堆栈错误

10-18 22:43:34.169 2459-2523/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime: Process: com.httpkhronolog.khronolog, PID: 2459 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground() 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at android.os.AsyncTask$3.done(AsyncTask.java:309) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.lang.Thread.run(Thread.java:818) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at com.httpkhronolog.khronolog.Login_Activity$checkUserDetails.doInBackground(Login_Activity.java:137) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at com.httpkhronolog.khronolog.Login_Activity$checkUserDetails.doInBackground(Login_Activity.java:79) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
10-18 22:43:34.169 2459-2523/? E/AndroidRuntime:  at java.lang.Thread.run(Thread.java:818)  

的login.php

<?php 

    if($_SERVER["REQUEST_METHOD"] == "POST"){ 
     // Establishing Connection with Server by passing server_name, user_id and password as a parameter 
     $connection = mysql_connect("localhost", "someusername", "Password"); 
     // Selecting Database 
     $db = mysql_select_db("khronolo_systemdb", $connection); 

     $username = $_POST["username"]; 
     $password = $_POST["password"]; 

     $query = "SELECT * FROM user_table WHERE password='$password' AND email='$username';"; 
     $result = mysql_query($query, $connection) or die (mysql_error($connection)); 
     $rows = mysql_num_rows($result); 
     if ($rows == 1) { 
      $returnValue[] = array("loginStatus"=> "true"); 
      echo json_encode($returnValue); 
     } 
     else { 
      $returnValue[] = array("loginStatus"=> "false"); 
      echo json_encode($returnValue); 
     } 

     mysql_close($connection); 
    } 
    ?> 
+0

还有什么对你行没有137 json = sb2.toString();取代json = result.toString();? –

+0

json = result.toString(); –

+0

你的结果为空 –

回答

1

使用Volley从谷歌一个网络库。跟随这tutorial为相同。要了解更多有关排球link

还有其他网络库,如okHttp

而且以现在你的代码被认为是:

在137行

0

Inste的

json = result.toString(); 

广告你应该做

json = sb2.toString(); 

说明

while循环退出时,其结果将是空的,这样做result.toString()会导致空指针异常。

任何其他库

您可以使用GSON库,帮助你获取/设置的响应值没有任何障碍。

GSON error

+0

Dam我粗心大意! ! –