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.
精彩评论