使用 Okhttp 从 PHP 脚本获取数据时遇到 android.os.NetworkOnMainThreadException
Encountering android.os.NetworkOnMainThreadException while fetching data from a PHP script using Okhttp
我正在 android app.To 使用 phpmyadmin 在我的本地主机上从应用程序服务器 运行 获取数据,我正在使用下面描述的 php 脚本:
<?php
$host = "localhost";
$db_user = "root" ;
$db_password = "" ;
$db_name = "FCM";
if(isset($_POST["Token"])){
$con = mysqli_connect($host,$db_user,$db_password,$db_name);
$sql = "select * from User";
$res = mysqli_query($con,$sql);
$result = array();
while($row = mysqli_fetch_array($res)){
array_push($result,
array('UserName'=>$row[0], 'EmailID'=>$row[1], 'UID'=>$row[2]
));
}
echo json_encode(array("users"=>$result));
mysqli_close($con);
}
?>
并且在我的 java class 中,为了收集响应,我使用 Okhttp
和下面描述的代码:
public void getDataOKHTTP() {
OkHttpClient client = new OkHttpClient();
RequestBody body = new FormBody.Builder().add("Token","").build();
Request request = new Request.Builder().url("http://.........../fcm/test.php").post(body).build();
System.out.println("@ register a new token ");
try {
Response response= client.newCall(request).execute();
//response.header("Content-Type: application/json");
myJSON = response.body().string();
}catch (IOException e){
e.printStackTrace();
}
}
但是当我 运行 我的应用程序时,我得到,
com.example.apple.fetchdata, PID: 6092
android.os.NetworkOnMainThreadException.
如果您能帮助我学习并解决这个问题,我将不胜感激。
谢谢你:)
所有网络操作都必须在后台线程上完成,而您在主线程上进行
我知道这个问题的答案来晚了。
正如 Th3Dark0 所说,所有网络调用都必须在后台线程上完成,您应该使用 enque 方法而不是在 OKHttp 中进行调用时执行。
如果您仍然感兴趣,可以在这里看看:
Networking with OkHttp
我正在 android app.To 使用 phpmyadmin 在我的本地主机上从应用程序服务器 运行 获取数据,我正在使用下面描述的 php 脚本:
<?php
$host = "localhost";
$db_user = "root" ;
$db_password = "" ;
$db_name = "FCM";
if(isset($_POST["Token"])){
$con = mysqli_connect($host,$db_user,$db_password,$db_name);
$sql = "select * from User";
$res = mysqli_query($con,$sql);
$result = array();
while($row = mysqli_fetch_array($res)){
array_push($result,
array('UserName'=>$row[0], 'EmailID'=>$row[1], 'UID'=>$row[2]
));
}
echo json_encode(array("users"=>$result));
mysqli_close($con);
}
?>
并且在我的 java class 中,为了收集响应,我使用 Okhttp
和下面描述的代码:
public void getDataOKHTTP() {
OkHttpClient client = new OkHttpClient();
RequestBody body = new FormBody.Builder().add("Token","").build();
Request request = new Request.Builder().url("http://.........../fcm/test.php").post(body).build();
System.out.println("@ register a new token ");
try {
Response response= client.newCall(request).execute();
//response.header("Content-Type: application/json");
myJSON = response.body().string();
}catch (IOException e){
e.printStackTrace();
}
}
但是当我 运行 我的应用程序时,我得到,
com.example.apple.fetchdata, PID: 6092 android.os.NetworkOnMainThreadException.
如果您能帮助我学习并解决这个问题,我将不胜感激。
谢谢你:)
所有网络操作都必须在后台线程上完成,而您在主线程上进行
我知道这个问题的答案来晚了。 正如 Th3Dark0 所说,所有网络调用都必须在后台线程上完成,您应该使用 enque 方法而不是在 OKHttp 中进行调用时执行。 如果您仍然感兴趣,可以在这里看看: Networking with OkHttp