No se puede ejecutar un AlertDialog en un método doInbackground ()

Tengo problemas para ejecutar un AlertDialog en un postexecute (). Lanza esta excepción Causado por: java.lang.RuntimeException: No se puede crear el controlador dentro del hilo que no ha llamado Looper.prepare () Como alternativa, cuando colocé AlertDialog.Builder en, simplemente no funcionó la ayuda de Pls. También en un caso en que se introdujo una contraseña incorrecta, se termina el proceso. ¿Cómo puedo llamar a un método Toast en un caso en que el nombre de usuario o la contraseña no son válidos A continuación se muestra el fragmento de código

public void Login() { // Toast.makeText(getBaseContext(), pass.getText() + " " // +user.getText(), // Toast.LENGTH_SHORT).show(); String url = "http://107.20.195.151/mcast_ws/" + "?user=" + user.getText().toString() + "&password=" + pass.getText().toString(); result = getHttpResponse(url); } String result; private String getHttpResponse(String location) { result = ""; URL url = null; Log.d(LOGTAG, " " + "location " + location); try { url = new URL(location); } catch (MalformedURLException e) { Log.e(LOGTAG, " " + "error" + e.getMessage()); } if (url != null) { try { HttpURLConnection connection = (HttpURLConnection) url .openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader( connection.getInputStream())); String inputLine; int lineCount = 0; while ((inputLine = in.readLine()) != null) { result += inputLine.trim(); } in.close(); connection.disconnect(); } catch (Exception e) { Log.e(LOGTAG, " " + "IOError " + e.getMessage()); Toast.makeText(getBaseContext(), "No Internet Access", Toast.LENGTH_SHORT); } } else { Log.e(LOGTAG, " " + "url" + url); } return result; } class PostToTwitter extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { Login(); Log.d(LOGTAG, "Success"); Log.d(LOGTAG, result); Log.d(LOGTAG, result.substring(0, 16).trim()); // Log.d(TweetActivity.getLogtag(),"Successfully Posted: " + // params[0]); return "success"; } @Override protected void onPostExecute(String r) { // TODO Auto-generated method stub super.onPostExecute(result); String msg = "Login successful"; if (result.substring(0, 16).trim().equals(msg)) { // System.out.println(result.substring(0, 16).trim()); Log.d(LOGTAG, " " + "Connection Test" + result); AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()); builder.setMessage("Are you sure send this SMS?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { //...Attach another thread event to send the sms } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); Log.e(LOGTAG, "Error detected 2"); AlertDialog alert = builder.create(); alert.show(); //return "success"; // Toast.makeText(getBaseContext(), // "Login Succesful",Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getBaseContext(), "Login UnSuccesful. Check Username or password", Toast.LENGTH_SHORT).show(); //return null; } // Toast.makeText(getApplicationContext(), result // ,Toast.LENGTH_SHORT).show(); Log.e(LOGTAG, "Error detected"); /* Intent i = new Intent("com.sms.subsahara.COMPOSESMS"); startActivity(i); //Log.e(LOGTAG, " " + "error2");*/ } } 

Sobre la aplicación de las sugerencias de Alex, he modificado el código original de este arriba, pero aún así obtener un error.Below es la excepción de la logcat

 E/AndroidRuntime( 326): Uncaught handler: thread main exiting due to uncaught exception E/AndroidRuntime( 326): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application E/AndroidRuntime( 326): at android.view.ViewRoot.setView(ViewRoot.java:472) E/AndroidRuntime( 326): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) E/AndroidRuntime( 326): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) E/AndroidRuntime( 326): at android.app.Dialog.show(Dialog.java:239) E/AndroidRuntime( 326): at com.sms.subsahara.WebMessengerActivity$PostToTwitter.onPostExecute(WebMessengerActivity.java:216) E/AndroidRuntime( 326): at com.sms.subsahara.WebMessengerActivity$PostToTwitter.onPostExecute(WebMessengerActivity.java:1) E/AndroidRuntime( 326): at android.os.AsyncTask.finish(AsyncTask.java:417) E/AndroidRuntime( 326): at android.os.AsyncTask.access$300(AsyncTask.java:127) E/AndroidRuntime( 326): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) E/AndroidRuntime( 326): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 326): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime( 326): at android.app.ActivityThread.main(ActivityThread.java:4363) E/AndroidRuntime( 326): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 326): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime( 326): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) E/AndroidRuntime( 326): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) E/AndroidRuntime( 326): at dalvik.system.NativeStart.main(Native Method) 

doInBackground no está sincronizado con el subproceso de interfaz de usuario, lo que significa que no puede manipular directamente elementos de interfaz de usuario, iniciar diálogos, etc., dentro del método. La solución es fácil. Simplemente mueva su código onPostExecute método onPostExecute (que está sincronizado con el subproceso de interfaz de usuario).

Cuando trabaje con AsyncTask s, recuerde que:

  1. doInBackground está destinado a realizar la operación potencialmente costosa (acceso a la red, conexión de socket, consulta de base de datos, etc.)
  2. onPostExecute está destinado a hacer algo con los resultados, si lo desea (este método se sincroniza con el subproceso de interfaz de usuario, por lo que puede manipular elementos de la interfaz de usuario directamente)

DoInBackground () sólo se ejecuta en un subproceso diferente que el subproceso de interfaz de usuario principal. Ése es el punto entero del AsyncTask.

Hay 3 formas de publicar tus resultados en la interfaz de usuario (prácticamente … en el subproceso de la interfaz de usuario)

  1. Use el método onPostExecute. Obtiene el valor de retorno de su método doInBackground pasado, y puede hacer cualquier cosa con él. (Creo que esto coincide con su caso de uso.)

  2. Si su tarea está en marcha y desea obtener pequeñas ráfagas de información sobre la interfaz de usuario, como una actualización de la barra de progreso, utilice publishProgress (…) del método doInBackground, que se pasará a su método onProgressUpdate (…) En AsyncTask, que se ejecutará en el subproceso de interfaz de usuario.

  3. Similar a 2, pero puede utilizar el método de conveniencia RunOnUiThread (…) para lanzar un runnable para ejecutarse en el subproceso de UI. Puede que no sea el código más bonito cuando tienes varios métodos anónimos flotando, pero es para hacerlo de forma rápida y sucia. Tenga en cuenta que este método está disponible en la clase de actividad y no en la clase de contexto, que puede ser un disyuntor de acuerdo para algunos escenarios.

Supongo que es porque Login () está en AsyncTask dentro de la ejecución, no en el mainUI dentro de la ejecución. Puede onPostExecute el manejador en el interior, de nuevo a la ejecución del hilo principal; También puede utilizar en onPostExecute UIThread:

 runOnUiThread(new Runnable() { @Override public void run() { Login(); } }); 

Espero que pueda ayudarte.

@Alex Lockwood

AsyncTask.doInBackground(Void..params) es adecuado para operaciones muy largas y repetitivas, el mejor reemplazo sería un HandlerThread .

Razón:

En android 3.2, AsyncTask cambió su implementación de una manera significativa. A partir de Android 3.2, AsyncTask no crea un subproceso para cada instancia en AsyncTask, sino que utiliza un ejecutor para ejecutar el trabajo de trabajo de fondo para todas las AsyncTasks en un solo subproceso de fondo. Esto significa que cada subproceso AsyncTask debe ejecutarse uno tras otro. Por ejemplo, si tiene un hilo AsyncTask largo (buscador de imágenes de un REST), sugiero usar un HandlerThread en su lugar, ya que el thread de ejecución de tareas largas probablemente podría retrasar toda la cadena.

PERO

Es posible ejecutar AsyncTask en paralelo usando un ejecutor de pool de subprocesos , pero no sé la razón exacta, los programadores no recomiendan hacerlo, hay un par de razones detrás de lo que no es relevante para este post. Pero en caso de que hagas esto, te sugiero que hagas tu propio enhebrado en su lugar, usando manejadores para comunicarse con el hilo principal cuando sea necesario.

  • Uso de OpenGL para reemplazar Canvas - Android
  • Algunos parámetros de función denominados arg0, arg1, etc ... después de compilar una biblioteca JAR
  • Actualización de la hora y la fecha por segundo en Android
  • Enviar puntuaciones a las tablas de clasificación de Google Play Games y mostrar nuevos rangos
  • ¿Hay algo similar a strip_tags en Java?
  • Usando SQLCipher con el archivo de base de datos SQLite enviado sqlite
  • Keytool con Android SDK de Facebook
  • Eclipse se bloquea después de algún tiempo con error de java
  • LibGDX: Escala de partículas
  • Cómo cambiar el origen de ImageView en android
  • El método de archivo mkdirs () no funciona en android / java
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.