0

Приложение, которое я создаю прямо сейчас, имеет проблемы при использовании HTTP-сообщения. Когда тайм-аут, встречается, сбои приложений с помощью следующей ошибки:Ошибка при возникновении тайм-аута

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 

Это как источник выглядит следующим образом:

//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; 
} 

причиненном Java RuntimeException ... Хорошо, так что? Эту проблему нужно избегать, потому что это последняя ошибка в приложении, которое у меня есть прямо сейчас. Буду признателен за любую оказанную помощь.

ответ

1

Вы проблема show() способ.

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

Вы можете вызвать этот метод только в onPogressUpdate() или onPostExecute() или позвоните show() перед выполнением задачи. Также showAlert() вы не можете позвонить по телефону doInBackground().

Вы должны знать, что ничего не можете по ним именуете: UI в background thread. Так что для обновления вашего пользовательского интерфейса используйте только метод onProgressUpdate() или как я имел в виду onPostExecute().

EDIT:

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

Да, спасибо за информацию. Я удалил методы, но проблема все еще возникает ... – Xarialon

+0

какой тип проблем? скажи мне что-нибудь. – Sajmon

+0

Что вы подразумеваете под типами? – Xarialon

1

Удалить helper.showAlert() метод от метода doInBackGround(), Вы не можете работать на главном потоке из рабочего потока (не может обновить 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

done ........... – Xarialon

Смежные вопросы