发送给我日志的问题

时间:2010-03-29 06:52:37

标签: android

我曾尝试在我的应用中实现发送日志功能,但我无法做到正确。有人可以帮我吗?在logcat中,它显示错误:

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

这是我的代码:

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();
 }
}

2 个答案:

答案 0 :(得分:0)

问题是mLogCollector永远不会被初始化,所以它总是为空。这会在NullPointerException中为您提供doInBackground

你可以在stacktrace中看到这个:

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

如果你阅读了android-send-me-logs文档的用法部分,那么用粗体字母表示的第一件事就是:

实例化LogCollector

LogCollector collector = new LogCollector(context);

你需要这样做。

答案 1 :(得分:0)

只是想指出LogCollector库在Droid X 2.3.x上不起作用。