2013-06-07 11 views
4

내 Android 앱에서 코드에 문제가 있습니다. 이전에 Async를 다루지 않았으므로 문제를 디버깅하는 방법을 잘 모릅니다. 보안상의 이유로 URL이 대체되었습니다.doInBackground() android 실행 중 오류가 발생했습니다.

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 
+0

Brian Roach가 말한 것처럼 catch 문 내에 Exception의 스택 추적을 인쇄하여 시작할 수 있습니다. 또한 실제로 어떤 문제가 발생하는지 지정하지 않았습니다. – Mena

+0

이 메소드는 createMsg (output, "Debug");를 어떻게 수행합니까? – Raghunandan

+0

@Raghunandan은 미리 감사의 글을 읽었습니다 ... – JohnHoulderUK

답변

11

당신은 (doInBackground에서 귀하의 경우) 비 UI 스레드에서 토스트 또는 Alertbox를 표시하기위한 runOnUiThread 또는 Hanlder를 사용할 수 있습니다. UI는 스레드에 특히 아니므로

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; 

} 
+0

도움을 주셔서 감사합니다. 이것은 내가 원하는대로 일했다 :) – JohnHoulderUK

+0

올바른 방법, 그것을 사용 AssyncTasks ...입니다하지만 runOnUiThread도 잘 작동합니다 ... –

3

AsyncTaskdoInBackground에있어서, 상기 디스플레이 (인터페이스)의 모든 작업을 수행하지 않아야으로 수행. @ ρяσѕρєя K의 답변에 게시 된 접근 방식을 사용하여이 작업을 수행 할 수 있지만 AsyncTask의 핵심은 백그라운드 스레드에서 UI에 구조적으로 액세스 할 수있는 쉬운 메커니즘을 제공하는 것이 었습니다.

createMsgdoInBackground에서 호출하면이 패러다임을 벗어납니다. 될 것입니다

  • onProgressUpdate
  • 을 완료하면 doInBackground 실행됩니다 doInBackground
  • onPostExecute 전에 실행됩니다

    • onPreExecute,,, :는 AsyncTask를 모든 UI 조치는 원칙적으로부터 시작되어야한다 publishProgressdoInBackground

    Android dev page 좋은 사용 예를 포함에서 호출 될 때마다 실행합니다.

    귀하의 경우 onPostExecute에 의해 선택되는 doInBackground에서 성공 또는 실패 코드를 반환해야합니다. 실패 코드를 수신 한 경우 createMsg으로 호출해야합니다.

  • 관련 문제