Android onPostExecute无法获取PHP端json_encode返回结果的问题
看起来你遇到的问题很典型,我帮你梳理几个关键的排查和修复点,按优先级来:
首先修复Android端的明显错误
响应读取不完整
你的doInBackground里读取服务器响应时,只读了第一行就break了!这会导致如果服务器返回的内容有多行(比如PHP输出了警告信息+JSON),你只能拿到部分内容,甚至不是完整的JSON结构,后续解析自然出问题。把break删掉:while((line = reader.readLine()) != null) { sb.append(line); // 移除这行 break; }Toast没有显示
你写了Toast但没调用show()方法!就算逻辑执行成功,你也看不到提示,误以为没响应:// 修正前(不会显示) Toast.makeText(emp_home.this,"Invalid Succesful..",Toast.LENGTH_SHORT); // 修正后 Toast.makeText(emp_home.this,"Login Successful..",Toast.LENGTH_SHORT).show();顺便把提示文字改对,"Invalid Succesful.."明显是笔误,别误导自己。
先打印原始响应内容
在onPostExecute里先把拿到的result打印出来,不管是用Log还是Toast,先确认你到底拿到了什么:@Override protected void onPostExecute(String result){ // 先看原始数据,这是排查问题的关键 Log.d("SigninDebug", "Raw response: " + result); Toast.makeText(emp_home.this, "Received: " + result, Toast.LENGTH_LONG).show(); try{ JSONObject jObj = new JSONObject(result); if(jObj.getBoolean("status")) { Toast.makeText(emp_home.this,"Login Successful..",Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(emp_home.this,"Invalid Login ! Try Again",Toast.LENGTH_SHORT).show(); } }catch (JSONException ex) { ex.printStackTrace(); // 给用户提示解析出错 Toast.makeText(emp_home.this, "Parse error: " + ex.getMessage(), Toast.LENGTH_SHORT).show(); } }这样你就能知道是没拿到数据,还是数据格式不对。
然后检查PHP端的潜在问题
添加SQL错误捕获
你现在完全没检查MySQL语句是否执行成功,如果插入失败(比如表结构不匹配、字段约束错误),PHP可能会输出警告信息,这些警告会和JSON混在一起,导致Android拿到的不是纯JSON。加上错误处理:$result3 = mysqli_query($con,$sql3); // 检查SQL执行状态 if(!$result3){ $resu["status"] = false; $resu["error_msg"] = mysqli_error($con); // 把错误返回给Android,方便排查 } // 指定响应类型为JSON,避免解析问题 header('Content-Type: application/json'); echo json_encode($resu);另外,你的
clean函数里的get_magic_quotes_gpc()已经废弃了(PHP5.4之后就移除了),可以删掉这部分逻辑,直接用trim($str)就行,别用@屏蔽错误。去掉不必要的Session
如果你的接口不需要Session,就把session_start()删掉,避免不必要的输出(比如Session的Cookie头或者警告信息干扰JSON输出)。
最后确认基础配置
- 检查AsyncTask是否正确执行:你在
emp_home的onCreate里有没有调用new SigninActivity().execute()?没执行的话肯定不会有响应。 - 确认网络权限:AndroidManifest.xml里必须有
<uses-permission android:name="android.permission.INTERNET" />,如果是Android 9+用HTTP的话还要加android:usesCleartextTraffic="true"(你用的是HTTPS,这条可以忽略,但还是确认下)。 - 测试PHP接口:用Postman或者curl模拟POST请求,传入
username参数,看看返回的是不是纯JSON(比如{"status":true})。如果PHP返回的不是纯JSON,那Android肯定解析失败。
按这个步骤排查,应该能快速定位问题!
内容的提问来源于stack exchange,提问作者user8856948

