Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 實戰Android仿人人客戶端之網絡模塊優化

實戰Android仿人人客戶端之網絡模塊優化

編輯:Android開發實例

       上一篇聊到網絡模塊的架構,我後來思考了下,覺得有可以優化的地方。

一、先提出我後來思考的問題:

       在AppBaseActivity(對Activity類的擴展)中,用變量mAsyncRequests存儲當前activity所持有的所有網絡請求,仔細閱讀過上一篇源碼的朋友,一定知道有兩處中斷當前Activity所持有的網絡異步處理,分別是在activity暫停(回調方法onPause())和銷毀(回調方法onDestroy())的時候。上一篇的處理方式,代碼片段如下:

  1. private void cancelRequest() {  
  2.         if (mAsyncRequests != null && mAsyncRequests.size() > 0) {  
  3.             for (AsyncBaseRequest request : mAsyncRequests) {  
  4.                 HttpURLConnection conn = request.getRequestConn();  
  5.                 if ( conn != null) {  
  6.                     try {  
  7.                         conn.disconnect();  
  8.                         System.out.println("onDestroy disconnect URL: " + conn.getURL());  
  9.                         mAsyncRequests.remove(request);  
  10.                     } catch (UnsupportedOperationException e) {  
  11.                         //do nothing .  
  12.                     }  
  13.                 }  
  14.             }  
  15.         }  
  16.     }  

      仔細閱讀上面的代碼片段,會發現只是斷開了網絡請求返回,之後就從當前Activity所持有的網絡請求集合中移除了AsyncBaseRequest對象,經過實踐就會發現,這種處理方式明顯存在問題。中斷網絡異步請求時,會有以下幾種場景:

       1、在異步線程中,當前正在發生著通過HTTP協議獲取服務器端返回的數據(InputStream),恰巧在這個時候調用請求中斷異步處理,上一篇的處理方式能處理。

       2、在異步線程中,當前正發生著網絡請求的數據已返回,這時調用中斷處理,也就是說後面的數據解析和刷新UI的事就不處理了,上一篇的處理方式不能滿足需求。

       3、在異步線程中,當前正發生著網絡請求返回的數據已解析完,這時調用中斷處理,也就是說後面讓主線程刷新UI的事就不處理了,上一篇的處理方式不能滿足需求。

       4、在異步線程中,當前正在發生著。。。,這時調用中斷處理,後面的。。。就不用處理了。(可以控制顆粒度精細點,呵呵)

二、對上面提出的問題,我的解決方案只考慮三種情況,在Activity中調用中斷處理時,異步線程中的預處理方式。

      1、在異步線程類(AsyncBaseRequest)中添加中斷標識,代碼如下:

  1. private boolean interrupted;  
  2.  
  3.   public boolean isInterrupted() {  
  4.       return interrupted;  
  5.   }  
  6.  
  7.   public void setInterrupted(boolean interrupted) {  
  8.       this.interrupted = interrupted;  
  9.   }  

      2、在異步線程類(AsyncBaseRequest)中的核心方法中添加預處理,代碼如下:

  1. @Override 
  2.   public void run() {  
  3.       try {  
  4.           if (interrupted) {  
  5.               System.err.println("訪問網絡前中斷業務處理線程(終止)");  
  6.               return;  
  7.           }  
  8.             
  9.           mInStream = getRequestResult();  
  10.           if (mInStream != null) {  
  11.               if (interrupted) {  
  12.                   System.err.println("解析數據前中斷業務處理線程(終止)");  
  13.                   return;  
  14.               }  
  15.  
  16.               String result = new String(readInputStream(mInStream));  
  17.               Object obj = parseHandler.parse(result);  
  18.  
  19.               if (interrupted) {  
  20.                   System.err.println("刷新UI前中斷業務處理線程(終止)");  
  21.                   return;  
  22.               }  
  23.  
  24.               requestCallback.onSuccess(obj);  
  25.           } else {  
  26.               System.out.println("get InputStream By HttpURLConnection return result is NULL.");  
  27.               requestCallback.onFail(Constant.NETWORK_REQUEST_RETUN_NULL); // 網絡請求返回NULL  
  28.           }  
  29.       } catch (IOException e) {  
  30.           requestCallback.onFail(Constant.NETWORK_REQUEST_IOEXCEPTION_CODE); // IO異常標識  
  31.           e.printStackTrace();  
  32.       } catch (JSONException e) {  
  33.           requestCallback.onFail(Constant.NETWORK_REQUEST_RESULT_PARSE_ERROR); // 網絡請求返回結果解析出錯  
  34.           e.printStackTrace();  
  35.       }  
  36.   }  

      3、在Activity(AppBaseActivity)中的處理,代碼如下:

  1. @Override 
  2. protected void onPause() {  
  3.     /**  
  4.      * 在activity暫停的時候,同時設置終止標識,終止異步線程  
  5.      */ 
  6.     cancelAllRequest();  
  7.     super.onPause();  
  8. }  
  9.  
  10. private void cancelAllRequest() {  
  11.     if (mAsyncRequests != null && mAsyncRequests.size() > 0) {  
  12.         try {  
  13.             for (AsyncBaseRequest request : mAsyncRequests) {  
  14.                 Thread thread = new Thread(request);  
  15.                 if (thread.isAlive() || !Thread.interrupted()) {  
  16.                     request.setInterrupted(true);  
  17.                 }  
  18.                   
  19.                 HttpURLConnection conn = request.getRequestConn();  
  20.                 if (conn != null) {  
  21.                     // conn.disconnect();  
  22.                     System.err.println("onDestroy disconnect URL: " + conn.getURL());  
  23.                 }  
  24.                   
  25.                 mAsyncRequests.remove(request);  
  26.             }  
  27.         } catch (Exception e) {  
  28.             // TODO Auto-generated catch block  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  
  32. }  
  33.  
  34. @Override 
  35. protected void onDestroy() {  
  36.     /**  
  37.      * 在activity銷毀的時候,同時設置終止標識,終止異步線程  
  38.      */ 
  39.     cancelAllRequest();  
  40.     super.onDestroy();  
  41. }  

以上就是對上一篇網絡處理模塊中存在的問題,我的解決方式。大家有什麼更好的方式,可以交流下。互相借鑒,共同進步!
 


轉自:http://blog.csdn.net/android_ls/article/details/8740447

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved