AsyncTask
Uso de AsyncTask
Hilos y procesos en Android
4.- Tareas en segundo plano con AsyncTask
Ejemplo: AsyncTask en Android
Ejercicio: Descargar un fichero de Internet y mostrar su contenido en pantalla
Creación de la aplicación con Android Studio:
– Dar permisos en el manifiesto
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.conexionasincrona"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission-sdk-23 android:name="android.permission.INTERNET" /> <application android:usesCleartextTraffic="true" </application> </manifest>
– Usar view binding
build.gradle:
buildFeatures { viewBinding true }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/myLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="16dp" tools:context=".MainActivity"> <EditText android:id="@+id/editText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:layout_marginBottom="16dp" android:ems="10" android:inputType="textPersonName" android:text="@string/web" android:textAppearance="@android:style/TextAppearance.Material.Large" app:layout_constraintBottom_toTopOf="@+id/switch1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Switch android:id="@+id/switch1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:text="OkHttp" android:textAlignment="textEnd" app:layout_constraintBottom_toTopOf="@+id/button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText" /> <Button android:id="@+id/button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:layout_marginBottom="16dp" android:text="@string/descargar" app:layout_constraintBottom_toTopOf="@+id/webView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/switch1" /> <WebView android:id="@+id/webView" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginBottom="16dp" app:layout_constraintBottom_toTopOf="@+id/textView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/button" /> <TextView android:id="@+id/textView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:layout_marginBottom="79dp" android:text="Tiempo de descarga" android:textAppearance="@android:style/TextAppearance.Material.Large" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/webView" /> </androidx.constraintlayout.widget.ConstraintLayout>
– Descargar un fichero usando Java.net
public class Resultado { private int codigo; //indica el código de estado devuelto por el servidor web private String mensaje; //información del error private String contenido; //fichero descargado public int getCodigo() { return codigo; } public void setCodigo(int codigo) { this.codigo = codigo; } public String getMensaje() { return mensaje; } public void setMensaje(String mensaje) { this.mensaje = mensaje; } public String getContenido() { return contenido; } public void setContenido(String contenido) { this.contenido = contenido; } }
Clase Conexion
public class Conexion { public static Resultado conectarJava(URL url) throws IOException { } }
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ActivityMainBinding binding; long inicio, fin; TareaAsincrona tareaAsincrona; URL url; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); binding = ActivityMainBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); binding.button.setOnClickListener(this); } @Override public void onClick(View view) { try { url = new URL(binding.editText.getText().toString()); //if (comprobarPermiso()) if (binding.switch1.isChecked()) // descarga usando OkHttp // descargaOkHTTP(url); else // descarga usando AsyncTask y Java.net descarga(url); //else //mostrarError("No hay permiso para conectarse a Internet"); } catch (MalformedURLException e) { e.printStackTrace(); mostrarError(e.getMessage()); } catch (IOException ex) { mostrarError(ex.getMessage()); } } private void descarga(URL url) { inicio = System.currentTimeMillis(); tareaAsincrona = new TareaAsincrona(this); tareaAsincrona.execute(url); binding.textView.setText("Descargando la página"); } private void mostrarError(String mensaje) { Toast.makeText(this, mensaje, Toast.LENGTH_SHORT).show(); }
Creación de la tarea asíncrona usando AsyncTask (en MainActivity)
public class TareaAsincrona extends AsyncTask<URL, Void, Resultado> { private ProgressDialog progreso; private Context context; public TareaAsincrona(Context context) { this.context = context; } protected void onPreExecute() { progreso = new ProgressDialog(context); progreso.setProgressStyle(ProgressDialog.STYLE_SPINNER); progreso.setMessage("Conectando . . ."); progreso.setCancelable(true); progreso.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { TareaAsincrona.this.cancel(true); } }); progreso.show(); } protected Resultado doInBackground(URL... cadena) { Resultado resultado; try { // operaciones en el hilo secundario resultado = Conexion.conectarJava(cadena[0]); } catch (IOException e) { Log.e("HTTP", e.getMessage(), e); resultado = new Resultado(); // https://developer.mozilla.org/es/docs/Web/HTTP/Status // https://httpstatuses.com/ resultado.setCodigo(500); resultado.setMensaje(e.getMessage()); //cancel(true); } return resultado; } protected void onPostExecute(Resultado resultado) { progreso.dismiss(); // mostrar el resultado fin = System.currentTimeMillis(); if (resultado.getCodigo() == HttpURLConnection.HTTP_OK) binding.webView.loadDataWithBaseURL(String.valueOf(url), resultado.getContenido(), "text/html", "UTF-8", null); else { mostrarError(resultado.getMensaje()); binding.webView.loadDataWithBaseURL(String.valueOf(url), resultado.getMensaje(), "text/html", "UTF-8", null); } binding.textView.setText("Duración: " + String.valueOf(fin - inicio) + " milisegundos"); } protected void onCancelled() { progreso.dismiss(); // mostrar cancelación //Toast.makeText(context, "Cancelado", Toast.LENGTH_SHORT).show(); mostrarError("Cancelado"); } }
– Error: Cleartext http not permitted:
cleartext http traffic not permitted
– Prueba:
Acceso a un servidor web en la red local
Acceso a un servidor web en Internet: https://dam.org.es/ficheros/frases.html
Errores: página no encontrada, servidor caído, etc
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.