0

지금 구축하고있는 애플리케이션에 HTTP 게시물을 사용할 때 문제가 있습니다. 제한 시간은 다음과 같은 오류와 응용 프로그램이 충돌을 occures 경우 :시간 초과가 발생할 때 오류가 발생했습니다.

06-20 19:01:35.715: E/Timeout Exception:(3802): java.net.SocketTimeoutException 
06-20 19:01:35.720: W/dalvikvm(3802): threadid=15: thread exiting with uncaught exception (group=0x40c4d1f8) 
06-20 19:01:35.865: D/dalvikvm(3802): GC_CONCURRENT freed 67K, 18% free 13640K/16519K, paused 7ms+3ms 
06-20 19:01:35.870: E/AndroidRuntime(3802): FATAL EXCEPTION: AsyncTask #4 
06-20 19:01:35.870: E/AndroidRuntime(3802): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.lang.Thread.run(Thread.java:856) 
06-20 19:01:35.870: E/AndroidRuntime(3802): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.os.Handler.<init>(Handler.java:121) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.app.Dialog.<init>(Dialog.java:107) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.app.AlertDialog.<init>(AlertDialog.java:114) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.app.AlertDialog$Builder.create(AlertDialog.java:913) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.app.AlertDialog$Builder.show(AlertDialog.java:931) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at com.on_d_mand.live_evenementen.Helper.showAlert(Helper.java:357) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at com.on_d_mand.live_evenementen.SyncData.doInBackground(SyncData.java:99) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at com.on_d_mand.live_evenementen.SyncData.doInBackground(SyncData.java:1) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
06-20 19:01:35.870: E/AndroidRuntime(3802):  ... 5 more 

이 소스가 같은 모습입니다 : 자바의 RuntimeException에 의한

//ON PRE EXECUTE 
protected void onPreExecute(){ 

    if(MESSAGE != null){ 
     dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     dialog.setMessage(MESSAGE); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 
} 

//DO IN BACKGROUND 
@Override 
protected String doInBackground(String... urls) { 
    //SYNC DATA WITH THE SERVER 
    try{ 

     HttpParams httpParameters = new BasicHttpParams(); 
     // Set the timeout in milliseconds (30 seconds) until a connection is established. 
     // The default value is zero, that means the timeout is not used. 
     int timeoutConnection = 30 * 1000; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds (30 seconds) which is the timeout for waiting for data. 
     int timeoutSocket = 30 * 1000; 
     HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

     HttpClient httpclient = new DefaultHttpClient(httpParameters); 
     HttpPost httppost = new HttpPost(urls[0]); 
     httppost.setEntity(new UrlEncodedFormEntity(preparedInformation)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     IS = entity.getContent(); 

    }catch (SocketTimeoutException ste){ 
     Log.e("Timeout Exception: ", ste.toString()); 
    } 
    catch(Exception e){ 
     Log.e("log_tag", "Error in http connection"+e.toString()); 
    } 

    //CONVERT DATA INTO STRING 
    try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(IS,"iso-8859-1"),8); 
      SB = new StringBuilder(); 
      SB.append(reader.readLine() + "\n"); 
      String line="0"; 

      while ((line = reader.readLine()) != null) { 
       SB.append(line + "\n\n"); 
      } 

      IS.close(); 
      this.result = SB.toString(); 
    } 
    catch(Exception e){ 
     Log.e("log_tag", "Error converting result "+e.toString()); 
    } 

    return this.result; 
} 

... 좋아, 그래서 뭐? 이 문제는 내가 지금 가지고있는 응용 프로그램의 마지막 버그이기 때문에 피해야합니다. 어떤 도움이라도 대단히 감사합니다.

답변

1

문제는 show()입니다.

The method show() must be called from UI thread.

는 만 onPogressUpdate() 또는 onPostExecute()에서이 메소드를 호출하거나 작업을 실행하기 전에 show()를 호출 할 수 있습니다. 또한 showAlert()doInBackground()으로 전화 할 수 없습니다.

UIbackground thread에 업데이트 할 수 없음을 알아야합니다. 그래서 귀하의 UI를 업데이 트에만 onProgressUpdate() 방법이나 같은 의미 onPostExecute() 의미.

편집 :

catch(Exception ex){ 
    Log.e("log_tag", "Error in http connection"+e.toString()); 
    return ex.toString(); 
} 
+0

네, 감사합니다. 나는 그 방법을 제거했으나 문제는 여전히 발생합니다 ... – Xarialon

+0

어떤 유형의 문제입니까? 말해줘. – Sajmon

+0

유형별로 어떤 의미입니까? – Xarialon

1

doInBackGround() 방법에서 helper.showAlert() 방법을 제거, 당신은 (MainUI 스레드를 업데이트 할 수 없습니다) 작업자 스레드에서 메인 스레드에서 실행할 수 없습니다.

대신에 onProgressUpdate()을 사용하고 helper.showAlert()를 사용하십시오.

UPDATE : 정보에 대한

catch (SocketTimeoutException ste){ 
     Log.e("Timeout Exception: ", ste.toString()); 
     return ste.toString(); 
    } 
    catch(Exception e){ 
     Log.e("log_tag", "Error in http connection"+e.toString()); 
     return e.toString(); 
    } 


protected void onPostExecute(String result) { 
    Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show(); 
} 
+0

helper.showAlert() 및 다른 dialog.show() 메서드를 제거하여 작동하는지 확인했지만 문제가 여전히 발생합니다. – Xarialon

+0

내가 한 .......... – Xarialon

+0

완료 ... – Xarialon

관련 문제