es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Añadir a la vista de reciclaje si la URL es válida.

Quiero verificar la URL en el campo de edición y, si es válida, agregar un elemento en la vista recycler. Por este propósito, inicié un hilo para verificar la conexión HTTP.

thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String link = edt.getText().toString();
                        URL url = null;
                        try {
                            url = new URL(link);
                            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                            int code = connection.getResponseCode();

                            if(code == 200) {
                                Log.d(TAG, "reachable");
                                InsertItem(url,adapter);
                            } else {
                                Log.d(TAG, "in catch: not reachable");
                            }
                        }  catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
                thread.start();

El problema es el error que recibo cuando intento agregar un elemento:

private void InsertItem(URL url, MyAdapter adapter) {
    thread.currentThread().interrupt();
    arrayList.add(0,new file(url.toString()));
    adapter.notifyItemChanged(0);
};

y el error es:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error implica que el hilo de interfaz de usuario está intentando acceder a vistas desde otro hilo que no está permitido. En este caso, parece que el método InsertItem() se está llamando desde un hilo separado que no es el hilo de la interfaz de usuario, por lo tanto, se produce el error.

    Para solucionar este problema, puede utilizar el método runOnUiThread() de Android para actualizar la interfaz de usuario desde el hilo separado. Así es como puede modificar su método InsertItem():

    private void InsertItem(URL url, MyAdapter adapter) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                arrayList.add(0,new file(url.toString()));
                adapter.notifyItemChanged(0);
            }
        });
    };
    

    Al utilizar el método runOnUiThread(), está ejecutando la actualización de la interfaz de usuario en el hilo de la interfaz de usuario y no en el hilo separado, lo que evita el error “CalledFromWrongThreadException”.

Comments are closed.