开发者

problem with send me log

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:

03-29 21:23:37.636: ERROR/AndroidRuntime(820): Uncaught开发者_如何学JAVA 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

Here is my 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<Void, Void, Boolean> {
  @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<Void, Void, Boolean>() {
    @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();
 }
}


The problem is that mLogCollector is never initialized so it is always null. This is giving you a NullPointerException in doInBackground.

You can see this in the stacktrace:

Caused by: java.lang.NullPointerException
  at resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1565)

If you read the usage section of the documentation for android-send-me-logs, one of the first things it says in big bold letters is:

Instantiate LogCollector

LogCollector collector = new LogCollector(context);

You need to do this.


Just wanted to point out the LogCollector library doens't work on Droid X 2.3.x.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜