Понятия не имею, почему код не приводит к ответу, всегда терпит неудачу - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю это приложение, которое получает объект bus из файла JSON и отображает его информацию с помощью идентификатора.Проблема в том, что я следовал инструкциям и делал все, как видел в постах и ​​видео, но приложение всегда не получало ответа.Что может быть, что мне не хватает?

Я работаю в Android Studio с необходимыми файлами gradle, необходимыми для retrofit2 и gson-converter.Я создал интерфейс API, класс создателя Retrofit и класс генератора ServiceApi. Также я сделал аннотации @SerializedName для класса, который будет получать данные json.Тем не менее, понятия не имею, почему это не работает.

JSON:

{
    "response_code":5,
    "response_msg":"Success",
    "bus":{
        "vehicle_id":"1",
        "vehicle_plate":"ا ا ا 4389",
        "category":"ورشة",
        "category_id":2,
        "last_seen":"2019-04-15T12:19:24.4223277",
        "location":{
            "lat":0.0,
            "lon":0.0
        },
        "status":{
            "sos":false,
            "ignition":"",
            "movement":false,
            "speed":0.0
        },
            "driver":{
                "driver_id":0,
                "driver_name":""
            },
            "inspection_report":[]
        }
}

Вот MainActivity.java (на данный момент это просто тест "success" или "fail", но этовсегда выдает мне ошибку):

public class MainActivity extends AppCompatActivity {


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

        ApiGenerator.getServiceApi().getBusStatus("1").enqueue(new Callback<BusStatus>() {
            @Override
            public void onResponse(Call<BusStatus> call, Response<BusStatus> response) {
                Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(Call<BusStatus> call, Throwable t) {
                Toast.makeText(MainActivity.this, "fail", Toast.LENGTH_SHORT).show();
            }
        });
    }

}

Вот BusStatus.java, который будет получать данные json:

public class BusStatus {

    @SerializedName("response_code")
    private Integer response_code;
    @SerializedName("response_msg")
    private String response_msg;
    @SerializedName("bus")
    private Bus bus;

    public BusStatus(int response_code, String response_msg, Bus bus) {
        this.response_code = response_code;
        this.response_msg = response_msg;
        this.bus = bus;
    }

    public Integer getResponse_code() {
        return response_code;
    }

    public void setResponse_code(Integer response_code) {
        this.response_code = response_code;
    }

    public String getResponse_msg() {
        return response_msg;
    }

    public void setResponse_msg(String response_msg) {
        this.response_msg = response_msg;
    }

    public Bus getBus() {
        return bus;
    }

    public void setBus(Bus bus) {
        this.bus = bus;
    }
}

Интерфейс MyApi.java (не уверен, если я написал запрос в правойпуть):

public interface MyApi {



    @GET("/*API PATH*/")
    Call<BusStatus> getBusStatus(@Query("id") String vehicle_id);

}

Создатель RetrofitClient, RetrofitClientInstance:

public class RetrofitClientInstance {

    private static Retrofit retrofit;

    public static Retrofit getRetrofitInstance(){
        Gson gson = new GsonBuilder().setLenient().create();
        if(retrofit == null){
            retrofit = new Retrofit.Builder()
                    .baseUrl(/*BASE URL*/)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();
        }
        return retrofit;
    }

}

Генератор API, ApiGenerator.java:

public class ApiGenerator {

    public static MyApi getServiceApi(){
        return RetrofitClientInstance.getRetrofitInstance().create(MyApi.class);
    }

}

Я также убедился, что добавил Интернетразрешение в AndroidManifest.xml (не обращайте внимания на другое содержимое):

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

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

    <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=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

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

Редактировать: это ошибка, которую я получаю при получении сообщения Throwable t: "java.net.UknownServiceExeption: связь CLEARTEXT с (/ базой)url /) не разрешено политикой безопасности сети "

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Я думаю, что вы используете Android Pie, поэтому у вас возникла эта проблема.Это связано с тем, что, как указано в документации:

Начиная с Android 9 (уровень API 28), поддержка открытого текста отключена по умолчанию.

Вы можете получить ещеПрочтите об этой ситуации из здесь , или вы можете продолжить и добавить использованиеCleartextTraffic в качестве атрибута для тега вашего приложения.

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>
0 голосов
/ 17 апреля 2019

Вы должны изменить в своем Базовом URL-адресе следующее: -

http://(BASE URL)/api/

и в inetrface, как это: -

@GET("(API PATH)?")
Call<BusStatus> getBusStatus(@Query("id") String vehicle_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...