Обнаружение исключения android.os.NetworkOnMainThreadException при извлечении данных из скрипта PHP с использованием Okhttp

Я делаю приложение для Android. Чтобы получить данные с сервера приложений, работающего на моем локальном хосте, с помощью 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, чтобы собрать ответ, я использую 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.

Я был бы очень признателен, если бы вы могли помочь мне изучить и решить эту проблему.

Спасибо :)


person Th3Dark0    schedule 21.09.2016    source источник
comment
Возможный дубликат NetworkOnMainThread   -  person Nikhil    schedule 21.09.2016
comment
Длительная задача должна быть в фоновом потоке, чтобы пользовательский интерфейс не блокировался, а приложение оставалось отзывчивым.   -  person Suhail Mehta    schedule 21.09.2016
comment
Возможный дубликат Как исправить исключение android.os.NetworkOnMainThreadException?   -  person Sanoop Surendran    schedule 21.09.2016
comment
вам нужно использовать AsyncTask для этого и вызвать getDataOKHTTP() в методе doInBackground()   -  person Arpit Patel    schedule 21.09.2016
comment
Используйте асинхронное получение в OkHttp.   -  person K Neeraj Lal    schedule 21.09.2016


Ответы (2)


Все сетевые операции должны выполняться в фоновом потоке, вы делаете это в основном потоке.

person Alex Shutov    schedule 21.09.2016

Я знаю, что это поздний ответ на этот вопрос. как сказал Th3Dark0, все сетевые вызовы должны выполняться в фоновом потоке, вы должны использовать метод enque, а не выполнять его при вызове в OKHttp. Вы можете посмотреть здесь, если вы все еще заинтересованы: Сеть с OkHttp

person islamdidarmd    schedule 27.07.2017