Ожидание продолжения AsyncTask postExecute для продолжения - PullRequest
0 голосов
/ 10 марта 2019

Я довольно новичок в концепции asynctask, и у меня есть asynctask, которая получает мне json из API с параметром a then (postexecute) помещает содержимое в текстовые представления, которые будут отображаться (они устанавливаются видимыми после установки текста) дело в том, что я пытаюсь проверить, что json на самом деле не пуст, и с моим кодом я действительно делаю это, но если параметр, который я использую, является правильным, проверка все равно обнаруживает, что он пуст, если я пытаюсь получить его снова ( нажатием кнопки, которая запускает асинхронную задачу) после 2 или 3 попыток он действительно получит ее, я думаю, что это потому, что я делаю это на заднем плане, вот асинктическая задача

 private class ConsultarDatos extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        // params comes from the execute() call: params[0] is the url.
        try {
            return downloadUrl(urls[0]);
        } catch (IOException e) {
            return "Unable to retrieve web page. URL may be invalid.";
        }
    }
    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {

        JSONArray ja = null;
        try {
            ja = new JSONArray(result);
            txtNombre.setText(ja.getString(0) +" " + ja.getString(1));
            txtCategoria.setText(ja.getString(2));
            txtDNI.setText(ja.getString(3));
            txtEstado.setText(ja.getString(4));
            //working=false;



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

    }
}

и вот что я пытаюсь сделать

        btnGenerar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            new ConsultarDatos().execute("https://api-adress/file.php?DNI=" + etDNI.getText().toString());

            //while(working)
            //{

            //}
            if (txtCategoria.getText()!="") {
                btnGenerar.setVisibility(View.INVISIBLE);
                etDNI.setVisibility(View.INVISIBLE);
                txtCategoria.setVisibility(View.VISIBLE);
                txtDNI.setVisibility(View.VISIBLE);
                txtEstado.setVisibility(View.VISIBLE);
                txtNombre.setVisibility(View.VISIBLE);
                imgTarjeta.setVisibility(View.VISIBLE);

            }
            else
            {
                Toast.makeText(getApplicationContext(),"DNI Incorrecto",Toast.LENGTH_LONG).show();
            }

        }
    });

Как я прокомментировал, я пытался сделать некоторое время, которое бы подождало, пока текстовые представления не будут полностью настроены, но это просто сломало мое приложение

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Я решил это, просто переместил набор видимости и проверку в конец onPostExecute и просто для того, чтобы быть уверенным, что я добавил тост в исключение, просто чтобы пользователь получил некоторую обратную связь

 protected void onPostExecute(String result) {
        JSONArray ja = null;
        try {
            ja = new JSONArray(result);
            txtNombre.setText(ja.getString(0) +" " + ja.getString(1));
            txtCategoria.setText(ja.getString(2));
            txtDNI.setText(ja.getString(3));
            txtEstado.setText(ja.getString(4));

            if (txtCategoria.getText()!="") {
                btnGenerar.setVisibility(View.INVISIBLE);
                etDNI.setVisibility(View.INVISIBLE);
                txtCategoria.setVisibility(View.VISIBLE);
                txtDNI.setVisibility(View.VISIBLE);
                txtEstado.setVisibility(View.VISIBLE);
                txtNombre.setVisibility(View.VISIBLE);
                imgTarjeta.setVisibility(View.VISIBLE);

            }
            else
            {
                Toast.makeText(getApplicationContext(),"DNI Incorrecto",Toast.LENGTH_LONG).show();
            }



        } catch (JSONException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(),"DNI Incorrecto",Toast.LENGTH_LONG).show();

        }

    }
0 голосов
/ 10 марта 2019

Используйте что-то вроде https://www.getpostman.com/, чтобы увидеть, каков результат вашего вызова API.Прямо сейчас кажется, что вы не знаете, что вы получаете, и как последовательно это возвращается.Вам нужно проверить, что ваш сервер отправляет вам верные данные.

Использование библиотеки json для анализа ответа JSON, такого как GSON или Moshi, также поможет вам.Прямо сейчас вы пытаетесь получить значения на основе произвольных чисел.Возможно, у вас исключение только из одного пропущенного поля, но недостаточно информации, чтобы сказать.Gson довольно легко настроить по моему опыту: https://github.com/google/gson

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...