Проблема с использованием сетевого соединения в Android Studio для получения ссылки json

У меня есть форма ниже, в которой я прочитал json с веб-адреса

http://hotplateprensas.com.br/ws/clientest.php

что дает мне строку типа json

{
  "clientes":[
     {
       "idClientesT":"1",
       "tipo":"s",
       "nome":"Carlos"},
     {
       "idClientesT":"2",
       "tipo":"s",
       "nome":"Rogério"
     }
  ]
}

Итак, я получил ее на AndroidStudio с Activity ниже:

package carcleo.com.radiosingular;

import android.os.Bundle;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import carcleo.com.radiosingular.classes.JsonClass;

public class form extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.form);
    }

    public void listaClientes (View View) {

        if (android.os.Build.VERSION.SDK_INT > 9){
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        String url = "http://hotplateprensas.com.br/ws/clientest.php";
        JsonClass json = new JsonClass();
        JSONObject clientesLista = json.getJSONFromUrl(url);

        clientes(clientesLista);
    }

    public void clientes(JSONObject jsonCli) {

        try {

            JSONArray arrayPlanetas = jsonCli.getJSONArray("clientes");

            for (int i = 0; i < arrayPlanetas.length(); i++) {

                JSONObject cliente = arrayPlanetas.getJSONObject(i);

                Log.d("idClientesT", cliente.getString("idClientesT"));
                Log.d("tipo", cliente.getString("tipo"));
                Log.d("nome", cliente.getString("nome"));

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

}

Этот код работает нормально.

Однако необходимо разместить растяжку кода ниже;

if (android.os.Build.VERSION.SDK_INT > 9){
   StrictMode.ThreadPolicy policy = new 
   StrictMode.ThreadPolicy.Builder().permitAll().build();
   StrictMode.setThreadPolicy(policy);
}

В противном случае ИНТЕРНЕТ-соединение НЕ устанавливается.

Однако я уже добавил разрешение на доступ к ИНТЕРНЕТУ в AndroidManifest.

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
    package = "carcleo.com.radiosingular">

    <uses-permission android:name = "android.permission.INTERNET" />
    <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup = "true"
        android:icon = "@mipmap/ic_launcher"
        android:label = "@string/app_name"
        android:roundIcon = "@mipmap/ic_launcher_round"
        android:supportsRtl = "true"
        android:theme = "@style/AppTheme">
        <activity android:name = ".login">
            <intent-filter>
                <action android:name = "android.intent.action.MAIN" />

                <category android:name = "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name = ".principal" />
        <activity android:name = ".form" />
        <activity android:name = ".retrofit" />
    </application>

</manifest>

Но бесполезно.

Если я удалю этот блок кода

if (android.os.Build.VERSION.SDK_INT > 9){
   StrictMode.ThreadPolicy policy = new 
   StrictMode.ThreadPolicy.Builder().permitAll().build();
   StrictMode.setThreadPolicy(policy);
}

связь к ИНТЕРНЕТ не происходит.

Проблема в том, что сколько раз мне нужно получить доступ к ИНТЕРНЕТ, будет столько же раз, сколько мне придется использовать этот фрагмент кода?

В Android Studio нет общего файла конфигурации для этого?

Класс jSon:

package carcleo.com.radiosingular.classes;

import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import cz.msebera.android.httpclient.HttpEntity;
import cz.msebera.android.httpclient.HttpResponse;
import cz.msebera.android.httpclient.client.ClientProtocolException;
import cz.msebera.android.httpclient.client.methods.HttpPost;
import cz.msebera.android.httpclient.impl.client.DefaultHttpClient;

public class JsonClass {

    InputStream input = null;
    JSONObject jObect = null;
    String json = "";

    //Recebe sua url
    public JSONObject getJSONFromUrl(String url) {
        //HTTP request
        try {
            // default HttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            input = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(input, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;

            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }

            input.close();

            json = sb.toString();

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // Transforma a String de resposta em um JSonObject
        try {
            jObect = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // retorna o objeto
        return jObect;

    }
}

Вы проверили logcat на наличие ошибок с указанием причины, по которой он не работает?

Vladyslav Matviienko 18.12.2018 19:52

вы определили свою функцию в create () ??? ваш созданный пуст

Arad Sheybak 18.12.2018 20:06

нет, я помещаю кнопку в форму (действие), а затем вызываю ее из списка функций onClick

Carlos Rocha 18.12.2018 20:08
0
3
38
1

Ответы 1

НИКОГДА не следует устанавливать такую ​​политику строгого режима потоков. Это совершенно неправильное решение. Вместо этого вам НЕ следует подключаться к сети в основном потоке - если вы сделаете это даже при выключенном строгом режиме, чтобы избежать сбоев, ваше приложение полностью перестанет отвечать.

Этот код нельзя использовать ни в коем случае. Вместо этого вы должны выполнять сетевой запрос (который происходит в getJsonFromUrl) в другом потоке.

Gabe Sechan 18.12.2018 20:17

так: JSONObject clientesLista = json.getJSONFromUrl (url). Вы можете увидеть это в вопросе. Но не работает без блока

Carlos Rocha 18.12.2018 20:19

Righjt - потому что он не может быть запущен из основного потока, потому что он делает сетевой запрос. Вызовите его в другом потоке. В Android не разрешены сетевые запросы в основном потоке. Ваш блок отключает это правило, что является плохой идеей.

Gabe Sechan 18.12.2018 20:22

но я не звоню из основного потока. Я вызываю его нажатием кнопки внутри формы. Смотрите в вопросе!

Carlos Rocha 18.12.2018 20:25

@CarlosRocha, не могли бы вы показать нам код для getJSONFromUrl.

Jude Fernandes 18.12.2018 20:36

Строка url = "hotplateprensas.com.br/ws/clientest.php"; JsonClass json = новый JsonClass (); JSONObject clientesLista = json.getJSONFromUrl (url);

Carlos Rocha 18.12.2018 20:37

в этом вопрос!

Carlos Rocha 18.12.2018 20:38

@CarlosRocha onClick и все функции пользовательского интерфейса выполняются в основном потоке. Я не думаю, что вы понимаете, что такое Thread.

Gabe Sechan 18.12.2018 20:41

в порядке. но я хотел бы знать, где мне нужно поместить его блок-код, чтобы он работал. Потому что я не ставлю это, значит, код не работает. ты понимаешь меня?

Carlos Rocha 18.12.2018 20:45

@CarlosRocha Я знаю. И ответ - вы нигде не ставите строгий режим. Вы перемещаете вызов getJsonFromUrl в новый поток или AsyncTask. Тогда все работает. И вам нужно сделать шаг назад и перестать беспокоиться о том, «как заставить это работать», и начать пытаться понять, как это работает, потому что вы будете постоянно сталкиваться с подобными проблемами.

Gabe Sechan 18.12.2018 20:51

jSon Class: добавьте в конец запроса.

Carlos Rocha 18.12.2018 20:51

Другие вопросы по теме