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.