No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () en el diálogo de diálogo de alerta
Me dieron un error en mi actividad de salpicaduras cuando se comprobó la conexión a Internet y no hay internet .. sucedió en mi diálogo de alerta, tal vez.
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:200) at android.os.Handler.<init>(Handler.java:114) at android.app.Dialog.<init>(Dialog.java:108) at android.app.Dialog.<init>(Dialog.java:148) at android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.java:43) at android.support.v7.app.AlertDialog.<init>(AlertDialog.java:95) at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:927) at com.example.study.Splash.checking(Splash.java:66) at com.example.study.Splash$2.run(Splash.java:51)
He intentado runOnUiThread()
pero todavía no funciona .. aquí está mi código de bienvenida
- ¿Cómo ver todos los artículos en arraylist java?
- ¿Cómo usar los eventos enviados por el servidor (SSE) en android?
- Evitar llamadas de método CONNECT no solicitadas desde HttpURLConnection
- Cómo llamar a onCreateOptionsMenu desde el código
- Android: usando el cliente java socket.io de Gottox en la aplicación android
package com.example.study; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import com.example.study.helper.SessionManager; import com.example.study.util.ConnectionDetector; public class Splash extends AppCompatActivity { private ConnectionDetector cd; Boolean isInternetPresent = false; protected SessionManager session; private AlertDialog.Builder builder; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); builder = new AlertDialog.Builder(Splash.this); session = new SessionManager(getApplicationContext()); cd = new ConnectionDetector(getApplicationContext()); builder.setTitle("No Connection"); builder.setMessage("Check Your Internet Connection."); builder.setIcon(R.drawable.fail); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { /* TODO Auto-generated method stub */ dialog.dismiss(); } }); Thread timer = new Thread(){ public void run(){ try { sleep(2000); } catch (Exception e) { e.printStackTrace(); } finally { checking(); } } }; timer.start(); } public void checking() { isInternetPresent = cd.isConnectingToInternet(); if(isInternetPresent) { session.checkLogin(); finish(); } else { builder.create().show(); finish(); } } }
- ¿Cómo paso un contexto a un AsyncTask?
- Cómo cancelar una solicitud http
- Alternativa a la biblioteca de lectores QR de zxing para Java / Android?
- Java No se puede crear el controlador dentro del subproceso que no ha llamado Looper.prepare ()
- Dagger 2: @ Component.Builder falta setters para los módulos o componentes necesarios: `
- ¿Qué causa "java.io.IOException: se restableció el flujo: CANCELAR" con okhttp y spdy?
- Stackoverflow en Android 2.3.3 Sólo dispositivos
- DrawLine problema con Paint.StrokeWidth = 1 en Android
En Android, Looper
es un sistema de colas que ejecuta un bucle de mensajes. De forma predeterminada, un Thread no tiene un Looper asociado con él cuando lo crea. Como tal, cuando su AlertDialog intenta utilizar la cola de mensajes se bloquea.
Usted podría crear un Looper en su nuevo hilo sin embargo, realmente debería estar utilizando un AlertDialog en el hilo principal. Para hacer esto, puede utilizar el método postDelayed
de un Handler
:
new Handler().postDelayed( new Runnable() { @Override public void run() { checking(); } }, 2000 );
En su método onCreate
Como un refinamiento a la pregunta anterior, probablemente haría lo siguiente ya que la actividad de la red en el hilo de IU es también una mala idea:
Crear un controlador en el onCreate ():
mHandler = new Handler();
Y todavía ejecuta checking () en su propio hilo, pero cambia ligeramente:
public void checking() { isInternetPresent = cd.isConnectingToInternet(); if(isInternetPresent) { session.checkLogin(); finish(); } else { mHandler.post(new Runnable() { @Override public void run() { builder.create().show(); finish(); }); } }
De esta manera, UI que hemos hecho en el hilo de la interfaz de usuario y la red se realiza en otro hilo.
- Cómo obtener la salida de registro de Android mostrada con las pruebas de JUnit (utilizando JUnit nativo sin emulador)
- Error: java.lang.IndexOutOfBoundsException: Índice 2 no válido, tamaño es 2