Android:http套接字超时 - 强制关闭错误

标签 android http sockets timeout connection

主类调用异步任务。异步任务调用 2 个过程。第一个解析 XML 文件并获取 html 链接。第二个读取该 html 文件。粘贴了异步任务代码和读取 html 文件的第二个过程(不要认为第一个过程会导致问题)即使在处理每个 http 异常并设置套接字超时后,我也会收到“强制关闭”异常。如果我单独调用 readfile 过程,我的手机上会出现 sockettimeout 异常(如果连接速度很慢)。但是如果我从异步任务中调用它,我会得到 Force Close 异常。

1) 为什么我的 logcat 中出现 sockettimeout 异常,即使我已经处理了异常? 2) 我将异常错误消息传递回异步任务。但它仍然没有显示。我还应该在异步任务过程中应用 try-catch 吗?

请帮忙。

问候, 山姆

           private class SelectDataTask extends AsyncTask<String, Void, List<String> {  
           private final ProgressDialog dialog = new ProgressDialog(MessageList.this);  
           // can use UI thread here  
          @Override  
           protected void onPreExecute() {  
            dialog.setMessage("Fetching scores...");  
            dialog.show();
         }  


         // automatically done on worker thread (separate from UI thread)
         @Override
         protected List<String> doInBackground(final String... args) {
                  List<String> scores = new ArrayList<String>();
                  List<String> scores1 = new ArrayList<String>();
                  scores =  loadFeed() ;

                  //return loadFeed();
                  for (String sco : scores) {
                      scores1.add(readFile(sco));
                  }
                  return scores1;  

         }


         // can use UI thread here
        @Override
         protected void onPostExecute(final List<String> result) {
            if (dialog.isShowing()) {
               dialog.dismiss();
            }
           adapter = 
                  new ArrayAdapter<String>(MessageList.this,R.layout.row,result);
           MessageList.this.setListAdapter(adapter);

         }
      }

      private String readFile(String htmllink){
       String TAG = "myActivity";
      List<String> scores = new ArrayList<String>();
      String result="";
      String score = "";
      int CONNECTION_TIMEOUT_MS = 30 * 1000; // ms

      HttpParams my_httpParams = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(my_httpParams,CONNECTION_TIMEOUT_MS); 
      HttpConnectionParams.setSoTimeout(my_httpParams, CONNECTION_TIMEOUT_MS); 
      HttpClient client = new DefaultHttpClient(my_httpParams);  // get http client with given params 
      HttpGet request = new HttpGet(htmllink);
      try{
             HttpResponse response = client.execute(request);
             //txtResult.setText(HttpHelper.request(response));
             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

                 try{
                     InputStream in = response.getEntity().getContent();
                     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                     StringBuilder str = new StringBuilder();
                     String line = null;
                     while((line = reader.readLine()) != null){
                         str.append(line + "\n");
                     }
                     in.close();

                     result = str.toString();
                     //result = str.toString().substring(1,500);

                     Pattern p = Pattern.compile(
                             "<title>(.*)</title>",
                              Pattern.DOTALL
                         );
                     Matcher matcher = p.matcher(
                              result
                         );

                     if (matcher.find())
                     {
                          score = matcher.group(1).toString();

                     }

                     return score;

                 } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                     Toast.makeText(this, "IOException e  = " + e.toString(), Toast.LENGTH_LONG).show();
                     Log.d(TAG, "IOException e  = " + e.toString());
                        client.getConnectionManager().shutdown();
                     return "IOException e  = " + e.toString();
                  }catch(Exception ex){
                     result = "Error";
                     ex.printStackTrace();
                     Toast.makeText(this, "Exception ex  = " + ex.toString(), Toast.LENGTH_LONG).show();
                     Log.d(TAG,"Exception ex  = " + ex.toString());
                        client.getConnectionManager().shutdown();     
           return "Exception ex  = " + ex.toString();
                 }
             } else {
                    client.getConnectionManager().shutdown();
                 return   "Error connecting" + response.getStatusLine().toString();
                 //sin.close();
             } //httpstatus
          } catch (SocketTimeoutException e) {
             e.printStackTrace();
             Toast.makeText(this, "SocketTimeoutException e  = " + e.toString(), Toast.LENGTH_LONG).show();
             Log.d(TAG, "SocketTimeoutException e  = " + e.toString());
             client.getConnectionManager().shutdown();
             return "SocketTimeoutException e  = " + e.toString();
          }catch(Exception ex){
              Toast.makeText(this, "Exception ex1  = " + ex.toString(), Toast.LENGTH_LONG).show();
                Log.d(TAG, "Exception ex1  = " + ex.toString());
                client.getConnectionManager().shutdown();
                return  "Exception ex1  = " + ex.toString();
         }

Logcat 错误信息

          W/System.err(18422): java.net.SocketTimeoutException
      W/System.err(18422):  at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:564)
      W/System.err(18422):  at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:88)
      W/System.err(18422):  at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
      W/System.err(18422):  at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
      W/System.err(18422):  at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:161)
      W/System.err(18422):  at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
      W/System.err(18422):  at java.io.InputStreamReader.read(InputStreamReader.java:275)
      W/System.err(18422):  at java.io.BufferedReader.fillBuf(BufferedReader.java:155)
      W/System.err(18422):  at java.io.BufferedReader.readLine(BufferedReader.java:425)
      W/System.err(18422):  at com.warriorpoint.androidxmlsimple.MessageList.readFile(MessageList.java:214)
      W/System.err(18422):  at com.warriorpoint.androidxmlsimple.MessageList.access$1(MessageList.java:182)
      W/System.err(18422):  at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:158)
      W/System.err(18422):  at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:1)
      W/System.err(18422):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
      W/System.err(18422):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
      W/System.err(18422):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
      W/System.err(18422):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
      W/System.err(18422):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
      W/System.err(18422):  at java.lang.Thread.run(Thread.java:1096)
      W/dalvikvm(18422): threadid=7: thread exiting with uncaught exception (group=0x400207d8)
      E/AndroidRuntime(18422): FATAL EXCEPTION: AsyncTask #1
      E/AndroidRuntime(18422): java.lang.RuntimeException: An error occured while executing doInBackground()
      E/AndroidRuntime(18422):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
      E/AndroidRuntime(18422):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
      E/AndroidRuntime(18422):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
      E/AndroidRuntime(18422):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
      E/AndroidRuntime(18422):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
      E/AndroidRuntime(18422):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
      E/AndroidRuntime(18422):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
      E/AndroidRuntime(18422):  at java.lang.Thread.run(Thread.java:1096)
      E/AndroidRuntime(18422): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
      E/AndroidRuntime(18422):  at android.os.Handler.<init>(Handler.java:121)
      E/AndroidRuntime(18422):  at android.widget.Toast.<init>(Toast.java:68)
      E/AndroidRuntime(18422):  at android.widget.Toast.makeText(Toast.java:231)
      E/AndroidRuntime(18422):  at com.warriorpoint.androidxmlsimple.MessageList.readFile(MessageList.java:276)
      E/AndroidRuntime(18422):  at com.warriorpoint.androidxmlsimple.MessageList.access$1(MessageList.java:182)
      E/AndroidRuntime(18422):  at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:158)
      E/AndroidRuntime(18422):  at com.warriorpoint.androidxmlsimple.MessageList$SelectDataTask.doInBackground(MessageList.java:1)
      E/AndroidRuntime(18422):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
      E/AndroidRuntime(18422):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
      E/AndroidRuntime(18422):  ... 4 more
      W/ActivityManager(  158):   Force finishing activity com.warriorpoint.androidxmlsimple/.MessageList

最佳答案

SocketTimeoutException 不是强制关闭的原因,异常堆栈跟踪只是打印到日志中,因为您要求打印它 (e.printStackTrace())。

这才是真正的问题:

Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

要解决真正的问题,请看这里:Can't create handler inside thread that has not called Looper.prepare() inside AsyncTask for ProgressDialog

关于Android:http套接字超时 - 强制关闭错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5230013/

相关文章:

iphone - iOS:我如何接收 HTTP 401 而不是 -1012 NSURLErrorUserCancelledAuthentication

java - 阻塞 BufferedReader 直到数据出现

android - 当我使用 eclipse 创建新的 android 项目时,它创建了两个 xml 布局

java - ConcurrentModificationException 房间 Android

资源的 HTTP 状态代码尚不可用

php - 带标题下载的文件不起作用

python - 在 OpenShift Python Hosting 上的端口上打开套接字

python - 安全直接连接文件传输程序

android - 尝试运行 systrace 时权限被拒绝

android - 如何将底部应用栏与顶部应用栏配对?