【问题标题】:an error occured while executing doInBackground() android [duplicate]执行doInBackground()android时发生错误[重复]
【发布时间】:2013-06-07 18:24:34
【问题描述】:

我的 Android 应用程序中的代码存在问题。我以前没有处理过异步,我不确定如何调试这个问题。出于安全原因,该 URL 已被替换。

class checkLogin extends AsyncTask<String, Void, Boolean> {
    protected Boolean doInBackground(String... params) {
        String urlStr = "http://example.com/api/?username=" + params[0] + "&password=" + params[1] + "&action=checkLogin";
        try{
            URL url = new URL(urlStr);
            HttpURLConnection connection= (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setUseCaches(false);
            connection.connect();
            BufferedReader reader= new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String output = "";
            String str;
            while ((str= reader.readLine()) != null) {
                output += "\r\n" + str;
            }
            createMsg(output,"Debug");
            return true;
        }catch(Exception e){
            createMsg("Encountered an error. Report this problem to the development department with steps to reproduce","Fatal Error");
            return false;
        }
    }
}

提前致谢!

编辑: createMsg 创建一个 android 警报框。

错误:

06-07 18:19:35.066: E/AndroidRuntime(1206): FATAL EXCEPTION: AsyncTask #1
06-07 18:19:35.066: E/AndroidRuntime(1206): java.lang.RuntimeException: An error occured while executing doInBackground()
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at java.lang.Thread.run(Thread.java:856)
06-07 18:19:35.066: E/AndroidRuntime(1206): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.os.Handler.<init>(Handler.java:197)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.os.Handler.<init>(Handler.java:111)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.app.Dialog.<init>(Dialog.java:107)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.app.AlertDialog.<init>(AlertDialog.java:114)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.app.AlertDialog$Builder.create(AlertDialog.java:931)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at com.unrealonline.timesheet.MainActivity.createMsg(MainActivity.java:55)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at com.unrealonline.timesheet.MainActivity$checkLogin.doInBackground(MainActivity.java:79)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at com.unrealonline.timesheet.MainActivity$checkLogin.doInBackground(MainActivity.java:1)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-07 18:19:35.066: E/AndroidRuntime(1206):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
06-07 18:19:35.066: E/AndroidRuntime(1206):     ... 4 more

【问题讨论】:

  • 正如 Brian Roach 所说,您可以首先在 catch 语句中打印异常的堆栈跟踪。此外,您还没有具体说明您遇到了什么问题。
  • 这个方法是做什么的 createMsg(output,"Debug");?
  • @Raghunandan 在提前致谢后阅读...
  • 我猜是 createMsg(output,"Debug");从 doInbackground() 更新 ui
  • 您不应更新 ui 表单 doinbackground 将其移至 onPostExecute。 doinbackground 的结果是 onpostExecute 的参数。因此根据结果,您可以在 onpostExecute 中显示错误消息

标签: java android android-asynctask


【解决方案1】:

您可以使用 runOnUiThreadHanlder 从非 UI 线程(在您的情况下从 doInBackground)显示 Toast 或 Alertbox。这样做:

try{
 //.....your code here...
while ((str= reader.readLine()) != null) {
       output += "\r\n" + str;
     }
Your_Current_Activity.this.runOnUiThread(new Runnable() {
    public void run() {
        createMsg(output,"Debug"); // show message here
    }
});

  return true;
}catch(Exception e){
   //use runOnUiThread for showing Alert here....
  return false;

}

【讨论】:

  • 感谢您的帮助。这如我所愿:)
  • 正确的做法是使用 AssyncTasks...但是 runOnUiThread 也能正常工作...
【解决方案2】:

AsyncTask 中的 doInBackground 方法不应在显示器(UI)上执行任何活动,因为它特别不在 UI 线程上。虽然您可以使用@ρяσѕρєя K 的答案中发布的方法来实现这一点,但 AsyncTask 的重点是提供一种简单的机制,以结构化方式从后台线程访问 UI。

当您从doInBackground 中调用createMsg 时,您就打破了这种范式。原则上,AsyncTask 中的所有 UI 操作都应从以下位置启动:

  • onPreExecute,将在doInBackground之前运行
  • onPostExecute,将在 doInBackground 完成后运行
  • onProgressUpdate,每当从 doInBackground 调用 publishProgress 时都会运行它

Android dev page 包含一个很好的用法示例。

在您的情况下,您似乎应该从doInBackground 返回一个成功或失败代码,该代码由onPostExecute 提取;如果收到失败代码,它应该调用createMsg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多