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)
doInBackground
is 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 your AlertDialog
code to the onPostExecute
method (which is synchronized with the UI thread).
When working with AsyncTask
s, remember that:
doInBackground
is meant to perform the potentially expensive operation (network access, socket connection, database query, etc.)onPostExecute
is meant to do something with the results, if you wish (this method is synchronized with UI thread, so you can manipulate UI elements directly)If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With