2011-03-08 69 views
1

主類調用異步任務。異步任務調用2個過程。第一個解析XML文件並獲得html鏈接。第二個閱讀該HTML文件。粘貼異步任務代碼和通過html文件讀取的第二個過程(不要認爲第一個過程會導致問題)即使處理每個http異常並設置套接字超時後,我也會收到「強制關閉」異常。如果我單獨調用readfile過程,我的移動設備上會發生套接字超時異常(如果連接速度很慢)。但是如果我從異步任務中調用它,我會得到強制關閉異常。Android:http套接字超時 - 強制關閉錯誤

1)爲什麼我在logcat中發生sockettimeout異常,即使我已經處理異常? 2)我將異常錯誤消息傳回給asynctask。但仍然沒有得到顯示。我應該在異步任務程序中應用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 

回答

1

的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

+0

這個問題是因爲我打印到日誌?我現在如何解決這個問題? – sammydude 2011-03-08 08:54:12

+0

不,這個問題與SocketTimeoutException無關。我的意思是SocketTimeoutException stacktrace首先在日誌中顯示,因爲你在那裏打印它,但是你的應用程序被殺死的原因是異常打印機_在日誌之後。 – Zds 2011-03-08 10:27:11