Проблема при загрузке пустого списка

У меня есть Listview, который отлично работает, когда у него есть данные, но, будучи пустым, то есть без данных в таблице BD, приложение останавливается. Я подтвердил, что когда соединение не найдено или возникает исключение, оно показывает сообщение, но я не понимаю, почему оно перестает работать, когда оно пусто в Listview

    public class AsyncRefrescar extends AsyncTask<String, String, String> {
    ProgressDialog pdLoading = new ProgressDialog(EnviarPregunta.this);
    HttpURLConnection conn;
    URL url = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pdLoading.setMessage("\tCargando preguntas...");
        pdLoading.setCancelable(false);
        pdLoading.show();

    }


    @Override
    protected String doInBackground(String... params) {
        try {

            url = new URL("http://bdauditorio.esy.es/Verpregunta/mostrarpre.php");

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return e.toString();
        }
        try {


            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(READ_TIMEOUT);
            conn.setConnectTimeout(CONNECTION_TIMEOUT);
            conn.setRequestMethod("GET");


            conn.setDoOutput(true);

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return e1.toString();
        }

        try {

            int response_code = conn.getResponseCode();


            if (response_code == HttpURLConnection.HTTP_OK) {


                InputStream input = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                StringBuilder result = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }


                return (result.toString());

            } else {

                return ("unsuccessful");
            }

        } catch (IOException e) {
            e.printStackTrace();
            return "exception";
        } finally {
            conn.disconnect();
        }


    }


    @Override
    protected void onPostExecute(String result) {

        pdLoading.dismiss();
        if (result.equalsIgnoreCase("exception") || result.equalsIgnoreCase("unsuccessful")) {
            final AlertDialog.Builder alertaDeError = new AlertDialog.Builder(EnviarPregunta.this);
            alertaDeError.setTitle("Error");
            alertaDeError.setMessage("Ups, no se han podido cargar las preguntas. Intentelo de nuevo.");
            alertaDeError.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
            alertaDeError.create();
            alertaDeError.show();
        } else {
            //Existen Datos
            List<String> preguntas = new ArrayList<String>();

            //Parsea la respuesta obtenida por el Asynctask
            JSONArray jsonArray = null;
            try {
                jsonArray = new JSONArray(result);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            assert jsonArray != null;
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject preguntaDatos = null;
                try {
                    preguntaDatos = jsonArray.getJSONObject(i);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                String pregunta = null;
                try {
                    assert preguntaDatos != null;
                    pregunta = preguntaDatos.getString("pregunta");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                preguntas.add(pregunta);
            }

//crear el Adapter.
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(EnviarPregunta.this,
                    android.R.layout.simple_list_item_1, preguntas);
            //Asignas el Adapter a tu ListView para mostrar los datos.
            mostrarr.setAdapter(adapter);




        }






    }

}

**unsuccessful** es cuando ha fallado la lectura hacia el servidor. 
0
задан 09.01.2017, 18:03
0 ответов

Просто не распределяй данных в Adapter, если ArrayList не содержит данных, ты можешь санкционировать это посредством метода .isEmpty(), это пример, как ты мог бы реализовывать это:

   if(!preguntas.isEmpty()){ //Valida si preguntas no contiene datos!.
       ArrayAdapter<String> adapter = new ArrayAdapter<String>(EnviarPregunta.this, android.R.layout.simple_list_item_1, preguntas);
       //Asignas el Adapter a tu ListView para mostrar los datos.
       mostrarr.setAdapter(adapter);
   }

Твой рисунок - что-то неправильное, ты был бы должен получать ответ в onPostExecute() и начиная с определения этой, если у него есть данные, на основании наполнения или нет этого Adapter.

 @Override
    protected void onPostExecute(String result) {
0
ответ дан 03.12.2019, 17:48

Не видя log ошибок, это легкое знание, которое происходит. И дело в том, что форма, в которой ты используешь try-catch, не имеет смысл.

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

Используй try, который завертывал бы весь метод, и используй catch (Exception e) или 2 или 3 Exception, если ты знаешь тип ошибки.

Сейчас, если твой этот BDD опустошает, он выйдет немедленно из-за catch и твоя ошибка более легкая для того, чтобы контролироваться, и ты можешь менять состояние видимости в GONE linearlayout, который завертывает listview

@Override
protected String doInBackground(String... params) {
    try {

        url = new URL("http://bdauditorio.esy.es/Verpregunta/mostrarpre.php");

        conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(READ_TIMEOUT);
        conn.setConnectTimeout(CONNECTION_TIMEOUT);
        conn.setRequestMethod("GET");
        conn.setDoOutput(true);

        int response_code = conn.getResponseCode();
        if (response_code == HttpURLConnection.HTTP_OK) {


            InputStream input = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            StringBuilder result = new StringBuilder();
            String line;

            while ((line = reader.readLine()) != null) {
                result.append(line);
            }


            return (result.toString());

        } else {

            return ("unsuccessful");
        }

    } catch (Exception e) {
        e.printStackTrace();
        return "exception";
    } finally {
        conn.disconnect();
    }
}



@Override
protected void onPostExecute(String result) {

    pdLoading.dismiss();
    if (result.equalsIgnoreCase("exception") || result.equalsIgnoreCase("unsuccessful")) {
        final AlertDialog.Builder alertaDeError = new AlertDialog.Builder(EnviarPregunta.this);
        alertaDeError.setTitle("Error");
        alertaDeError.setMessage("Ups, no se han podido cargar las preguntas. Intentelo de nuevo.");
        alertaDeError.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        alertaDeError.create();
        alertaDeError.show();
    } else {
        //Existen Datos
        List<String> preguntas = new ArrayList<String>();

        //Parsea la respuesta obtenida por el Asynctask
        JSONArray jsonArray = null;
        try {
            jsonArray = new JSONArray(result);

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject preguntaDatos = null;
                try {
                    preguntaDatos = jsonArray.getJSONObject(i);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                String pregunta = null;
                try {
                    assert preguntaDatos != null;
                    pregunta = preguntaDatos.getString("pregunta");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                preguntas.add(pregunta);
            }

            //crear el Adapter.
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(EnviarPregunta.this, android.R.layout.simple_list_item_1, preguntas);
            //Asignas el Adapter a tu ListView para mostrar los datos.
            mostrarr.setAdapter(adapter);

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

            final AlertDialog.Builder alertaDeError = new AlertDialog.Builder(EnviarPregunta.this);
            alertaDeError.setTitle("Error");
            alertaDeError.setMessage("Ups, no se han podido cargar las preguntas. Intentelo de nuevo.");
            alertaDeError.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
            alertaDeError.create();
            alertaDeError.show();
        }
    }
}
0
ответ дан 03.12.2019, 17:48