我曾尝试在我的应用中实现发送日志功能,但我无法做到正确。有人可以帮我吗?在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();
}
}
答案 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上不起作用。