Android; Есть ли возможный способ TimeOut приложения для успешного получения результатов до вызова следующего действия - PullRequest
0 голосов
/ 20 апреля 2020

я читаю JsonURL и пытаюсь открыть правильное действие, используя результаты из JsonURL, когда JsonURL возвращает ложное или истинное значение, которое, как предполагается, go другой деятельности. Когда я вызываю функцию, чтобы извлечь Json из URL-адреса и вставить его через IF l oop, чтобы выбрать, какое действие следует открыть, оно выбирает неправильное (всегда ложное l oop). я на 100% уверен, что это потому, что HttpConnection не получает достаточно времени для установления sh соединения и получения результатов до вызова Activity.

, так что ...

что возможный способ тайм-аута приложения, чтобы у него было время собрать результаты из JsonURL перед вызовом операторов IF?

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // makes the connection with the JsonURL and collect the results
        HttpClient.BuildClient();

        // this is where it doesn't get enough time to read the result and always gives a boolean result: false
        if (HttpClient.RegisteredDevice = true) {
            Intent i = new Intent(MainActivity.this, QuestionActivity.class);
            startActivity(i);
        }

        if (HttpClient.RegisteredDevice = false) {
            Intent i = new Intent(MainActivity.this, RegistrationActivity.class);
            startActivity(i);
        }
    }
}
public class HttpClient {

    public static Boolean RegisteredDevice;

    public static void BuildClient(){

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(JsonUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        JsonApi jsonApi = retrofit.create(JsonApi.class);

        Call<Post> call = jsonApi.getPosts("DeviceInfo");

        call.enqueue(new Callback<Post>() {
            @Override
            public void onResponse(Call<Post> call, Response<Post> response) {
                if (!response.isSuccessful()){
                    //textViewResult.setText("Code: " + response.code());
                    return;
                }


                RegisteredDevice = response.body().getDeviceExists();

            }

1 Ответ

0 голосов
/ 20 апреля 2020

Здесь вы делаете несколько ошибок:

Первая - логическое присвоение в условии if, которое go довольно легко заметить незамеченным. Вы не сравниваете, а присваиваете новое значение своей переменной. Пожалуйста, исправьте это.

if (HttpClient.RegisteredDevice = true)

Вторая ошибка не касается концепции многопоточности. HttpClient вызывает сетевой API в фоновом потоке (другой поток, отдельный от потока пользовательского интерфейса). Почему? поскольку сетевым вызовам (вызовам Api) требуется некоторое время для извлечения данных, если этот вызов выполняется в основном потоке, он заблокирует поток пользовательского интерфейса, что в конечном итоге приведет к cra sh.

, поскольку HttpClient ставит в очередь Ваши вызовы API в отдельном потоке, операторы if-else в вашей Деятельности вызываются сразу после оператора BuildClient();.

Пожалуйста, прочитайте о Многопоточность и Multi -прочитание в Android

Также еще одна вещь, которую необходимо исправить, это соглашение о программировании. Имена методов в Java должны начинаться со строчных букв, ie имя метода должно быть buildClient();

...