Hi,
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 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
Thanks.
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 {
@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() {
@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("
[email protected]", "Error Log", "Preface\nPreface line 2");
else
showDialog(DIALOG_FAILED_TO_COLLECT_LOGS);
}
}.execute();
}
dialog.dismiss();
}
}