title: Problem with Toast in AsyncTask method call
body: <p>Hey Everybody,<br>
  I have an AsyncTask that posts some data to a server. It does this by calling a static method that I wrote from doInBackground. When I run the AsyncTask, I send the context of the activity that called execute(), which I send to my static method, because it needs it to make a Toast if something goes wrong while talking to the server. However, I get this error when a Toast is made in the static method:</p>
  
  <pre><code>04-21 12:49:16.689: ERROR/AndroidRuntime(2123): FATAL EXCEPTION: AsyncTask #1
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): java.lang.RuntimeException: An error occured   while executing doInBackground()
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123):at android.os.AsyncTask$3.done(AsyncTask.java:200)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.lang.Thread.run(Thread.java:1019)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.os.Handler.&lt;init&gt;(Handler.java:121)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.widget.Toast.&lt;init&gt;(Toast.java:68)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.widget.Toast.makeText(Toast.java:23
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.util.ServerConnections.PostToLoginPage(ServerConnections.java:36)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.Whiteboard.WhiteboardLogin$LoginTask.doInBackground(WhiteboardLogin.java:150)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.Whiteboard.WhiteboardLogin$LoginTask.doInBackground(WhiteboardLogin.java:1)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.os.AsyncTask$2.call(AsyncTask.java:185)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
  04-21 12:49:16.689: ERROR/AndroidRuntime(2123): ... 4 more
  </code></pre>
  
  <p>Which is followed by a leaked window error. I am assuming this is because of an error with the context passed to the Toast in the static method. The AsyncTask is:</p>
  
  <pre><code>private class LoginTask extends AsyncTask&lt;Void, Void, Void&gt; {
  
      private WhiteboardLogin activity;
      private Context callingContext;
      private ProgressDialog dialog;
      private String user, pass;
      private boolean sendIntent = true, loginError = false, populateError = false;
  
      public LoginTask(WhiteboardLogin activity, String user, String pass, Context callingContext){
          this.activity = activity;
          this.user = user.trim();
          this.pass = pass.trim();
          this.callingContext = callingContext;
      }
  @Override
      protected Void doInBackground(Void... params) {
          ArrayList&lt;NameValuePair&gt; nameValuePairs = new ArrayList&lt;NameValuePair&gt;();
          nameValuePairs.add(new BasicNameValuePair("user",user));
          nameValuePairs.add(new BasicNameValuePair("pass",pass));
          sessionUser = user;
          sessionPassword = pass;
          //Posts the username and password to the login page and toasts an error if the login doesn't work 
          if(ServerConnections.PostToLoginPage(callingContext, nameValuePairs, activity.getString(R.string.loginPageURI)) == 1){
              dialog.dismiss();
              sendIntent = false;
              loginError = true;
              publishProgress();
             return null;
          }
          else{
             userDataList = populateUserDataList(callingContext, user,pass);
             if(userDataList == null){
                 dialog.dismiss();
                 sendIntent = false;
                 populateError = true;
                 return null;
             }
         }
         return null;
      }
  </code></pre>