Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't execute an AlertDialog in an doInbackground() method

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)
like image 670
nnanna Avatar asked Dec 15 '22 22:12

nnanna


1 Answers

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 AsyncTasks, remember that:

  1. doInBackground is meant to perform the potentially expensive operation (network access, socket connection, database query, etc.)
  2. 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)
like image 194
Alex Lockwood Avatar answered Jan 31 '23 03:01

Alex Lockwood