使用Okhttp从PHP脚本获取数据时遇到android.os.NetworkOnMainThreadException

时间:2016-09-21 06:13:21

标签: java php android okhttp okhttp3

我正在创建一个Android应用程序。要使用phpmyadmin从我的localhost上运行的应用服务器获取数据,我使用下面描述的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类中,为了收集响应,我正在使用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。

如果你能帮助我学习并解决这个问题,我将非常感激。

谢谢你:)

2 个答案:

答案 0 :(得分:1)

所有网络操作都必须在后台线程上完成,你是在主线程

上完成的

答案 1 :(得分:0)

我知道这个问题的答案很晚。 正如 Th3Dark0 所说,所有网络调用必须在后台线程上完成,你应该使用 enque 方法,而不是在OKHttp中进行调用时执行。 如果你还有兴趣,可以看看这里: Networking with OkHttp