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 

这是源的样子:

//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()

您必须知道,您可以拨打电话background 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

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

相关问题