2010-03-29 73 views
1

我曾尝试实现发送我日志功能到我的应用程序,但我无法正确理解。任何人都可以帮我一下吗?在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("[email protected]", "Error Log", "Preface\nPreface line 2"); 
    else 
     showDialog(DIALOG_FAILED_TO_COLLECT_LOGS); 
    } 

    }.execute(); 
    } 
    dialog.dismiss(); 
} 
} 

回答

0

的问题是,mLogCollector从未初始化,所以它总是空。这给你一个NullPointerExceptiondoInBackground

可以在堆栈跟踪看到:

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

您需要执行此操作。

+0

谢谢马克。我没有意识到这一点。在我添加mLogCollector =新的LogCollector(this)之后;这条线然后工作。 但是,当我点击报告强制关闭时,它会吐出一条消息,指出不支持的操作 - 该操作当前不受支持。 任何我错过了我的代码,使我能够发送日志到我的电子邮件? – Lynnooi 2010-03-29 09:30:36

0

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