Android: тайм-аут сокета http - ошибка принудительного закрытия - PullRequest
1 голос
/ 08 марта 2011

Основной класс вызывает асинхронную задачу. Асинхронная задача вызывает 2 процедуры. Первый, который анализирует XML-файл и получает ссылку html. Второй, чтобы прочитать этот HTML-файл. Вставил код асинхронной задачи и вторую процедуру, которая считывает html-файл (не думайте, что первая процедура вызывает проблемы) Я получаю исключения «Force Close» даже после обработки каждого исключения http и установки времени ожидания сокета. Если я вызываю процедуру readfile отдельно, я получаю исключение sockettimeout на своем мобильном телефоне (если соединение медленное). Но если я вызываю его из асинхронной задачи, я получаю исключения Force Close.

1) Почему я получаю исключение sockettimeout в моем logcat, хотя я обработал исключение? 2) Я передаю сообщение об ошибке исключения в asynctask. Но все равно это не отображается. Должен ли я применить try-catch в процедуре асинхронной задачи?

Пожалуйста, помогите.

С уважением, Sam

           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

1 Ответ

1 голос
/ 08 марта 2011

Исключение SocketTimeoutException не является причиной принудительного закрытия, трассировка стека исключений просто выводится в журнал, потому что вы просите его напечатать (e.printStackTrace ()).

Это реальная проблема:

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

Чтобы решить реальную проблему, посмотрите здесь: Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () внутри AsyncTask для ProgressDialog

...