title: problem with send me log
body: <p>I had try to implement the send me log feature into my apps but I can't get it right. Can anyone please help me with it? In the logcat, it shows the errors:</p>
  
  <pre>
  03-29 21:23:37.636: ERROR/AndroidRuntime(820): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
  03-29 21:23:37.726: ERROR/AndroidRuntime(820): java.lang.RuntimeException: An error occured while executing doInBackground()
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at java.lang.Thread.run(Thread.java:1058)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820): Caused by: java.lang.NullPointerException
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1565)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
  03-29 21:23:37.726: ERROR/AndroidRuntime(820):     ... 4 more
  </pre>
  
  <p>Here is my code:</p>
  
  <pre><code>public class helloAndroid extends Activity implements OnClickListener {
  
  public static final int DIALOG_SEND_LOG = 345350;
  protected static final int DIALOG_PROGRESS_COLLECTING_LOG = 3255;
  protected static final int DIALOG_FAILED_TO_COLLECT_LOGS = 3535122;
  
  
  private static final int DIALOG_REPORT_FORCE_CLOSE = 3535788;
  
   private LogCollector mLogCollector;
  
  public void onCreate(Bundle savedInstanceState) {
  
  
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  
    Bundle b = this.getIntent().getExtras();
    s = b.getString("specialValue").trim();
    String xmlURL = "";
  
    CheckForceCloseTask task = new CheckForceCloseTask();
       task.execute();
      }
      private void throwException() {
    throw new NullPointerException();
   }
  
   @Override
   protected Dialog onCreateDialog(int id) {
    Dialog dialog = null;
    switch (id) {
    case DIALOG_SEND_LOG:
    case DIALOG_REPORT_FORCE_CLOSE:
     Builder builder = new AlertDialog.Builder(this);
     String message;
     if (id==DIALOG_SEND_LOG)
      message = "Do you want to send me your logs?";
     else 
      message = "It appears this app has been force-closed, do you want to report it to me?";
     builder.setTitle("Warning")
     .setIcon(android.R.drawable.ic_dialog_alert)
     .setMessage(message)
     .setPositiveButton("Yes", this)
     .setNegativeButton("No", this);
     dialog = builder.create();
     break;
    case DIALOG_PROGRESS_COLLECTING_LOG:
     ProgressDialog pd = new ProgressDialog(this);
     pd.setTitle("Progress");
     pd.setMessage("Collecting logs...");
     pd.setIndeterminate(true);
     dialog = pd;   
     break;
    case DIALOG_FAILED_TO_COLLECT_LOGS:
     builder = new AlertDialog.Builder(this);
     builder.setTitle("Error")
     .setMessage("Failed to collect logs.")
     .setNegativeButton("OK", null);
     dialog = builder.create();
    }
    return dialog;
   }
  
   class CheckForceCloseTask extends AsyncTask&lt;Void, Void, Boolean&gt; {
    @Override
    protected Boolean doInBackground(Void... params) {
     return mLogCollector.hasForceCloseHappened();
    }
  
    @Override
    protected void onPostExecute(Boolean result) {
     if (result) {
      showDialog(DIALOG_REPORT_FORCE_CLOSE);
     } else
      Toast.makeText(getApplicationContext(), "No force close detected.", Toast.LENGTH_LONG).show();
    }
   }
  
   public void onClick(DialogInterface dialog, int which) {
    switch (which) {
    case DialogInterface.BUTTON_POSITIVE:
     new AsyncTask&lt;Void, Void, Boolean&gt;() {
      @Override
      protected Boolean doInBackground(Void... params) {
       return mLogCollector.collect();
      }
      @Override
      protected void onPreExecute() {
       showDialog(DIALOG_PROGRESS_COLLECTING_LOG);
      }
      @Override
      protected void onPostExecute(Boolean result) {
       dismissDialog(DIALOG_PROGRESS_COLLECTING_LOG);
       if (result)
        mLogCollector.sendLog("lintonye@gmail.com", "Error Log", "Preface\nPreface line 2");
       else
        showDialog(DIALOG_FAILED_TO_COLLECT_LOGS);
      }
  
     }.execute();
    }
    dialog.dismiss();
   }
  }
  </code></pre>