Cannot execute AlertDialog in doInbackground () method

I am having problems executing an AlertDialog in postexecute (). Throws this exception. Called: java.lang.RuntimeException: cannot create a handler inside the thread that Looper.prepare () did not call. Alternatively, when I placed AlertDialog.Builder, it just didn't work. Help Pls. Also, if you enter the wrong password, the process ends. How can I call the Toast method if the username or password is invalid The code snippet is below

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");*/ } } 

When applying suggestions from Alex, I changed the source code described above, but I still get the error message. Below is an exception from 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) 
+4
source share
4 answers

doInBackground does not synchronize with the user interface stream, which means that you cannot directly manipulate user interface elements, launch dialogs, etc. from inside the method. Easy to fix. Just move the AlertDialog code to the AlertDialog method (which synchronizes with the user interface thread).

When working with AsyncTask s, remember that:

  • doInBackground designed to perform a potentially expensive operation (network access, socket connection, database query, etc.).
  • onPostExecute should do something with the results if you want (this method is synchronized with the user interface thread so that you can directly manipulate the user interface elements)
+8
source

DoInBackground () is executed only in a different thread than the main UI thread. This is the whole point of AsyncTask.

There are 3 ways to publish the results in the user interface (pretty much ... in the user interface theme).

  • use the onPostExecute method. You get the return value of your doInBackground method, and you can do something with it. (I think this matches your use case.)

  • If your task is on and you want to get small bursts of information in the user interface, for example, updating the progress bar, use the publishProgress (...) method from the doInBackground method, which will then be passed to your onProgressUpdate (...) in AsyncTask, which will run in the user interface thread.

  • Similar to 2, but you can use RunOnUiThread (...) convenience method to run runnable to run in the user interface thread. It may not be the prettiest code when you use several anonymous methods, but for a quick and dirty way to do it. Note that this method is available for the Activity class, and not for the Context class, which may be a transaction interrupt for some scenarios.

+3
source

I assume, because you Login () are in AsyncTask inside the execution, and not inside the main executable. Can the onPostExecute handler inside, back to the main thread execution; Also can be used in onPostExecute UIThread:

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

I hope this can help you.

+1
source

@Alex Lockwood

AsyncTask.doInBackground(Void..params) not suitable for very long and repetitive operations, HandlerThread best replacement.

Cause:

In android 3.2, AsyncTask has significantly changed its implementation. Starting with Android 3.2, AsyncTask does not create a thread for each instance in AsyncTask; instead, it uses an executor to do background work for all AsyncTasks in one background thread! . This means that each AsyncTask thread must start one after another. So, for example, if you have a long AsyncTask thread (REST image picker), I suggest using HandlerThread, instead , because a thread with a long task may delay the whole chain.

BUT

You can safely run AsyncTask in parallel using the thread pool executor instead, but I don’t know the exact reason, programmers do not recommend this, there are several reasons that are not related to this mail. But in case you do this, I suggest that you use your own threads instead, use handlers to communicate with the main thread, when necessary.

0
source

All Articles