I am having problems executing a AlertDialog on a postexecute(). Throws this exception
Caused by: java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()
Alternatively, when I placed the AlertDialog.Builder in, it just didn’t work
Pls help.
Also in a case were a wrong password is entered, the process is terminated. How can I call a Toast method in a case were the usename or password is invalid
Below is the code snippet
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");*/
}
}
On applying the suggestions from Alex, I modified the original code this above, but still get an error.Below is the exception from the 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)
doInBackgroundis not synchronized with the UI thread, which means you cannot directly manipulate UI elements, launch dialogs, etc. from within the method. The fix is easy. Simply move yourAlertDialogcode to theonPostExecutemethod (which is synchronized with the UI thread).When working with
AsyncTasks, remember that:doInBackgroundis meant to perform the potentially expensive operation (network access, socket connection, database query, etc.)onPostExecuteis meant to do something with the results, if you wish (this method is synchronized with UI thread, so you can manipulate UI elements directly)