1. <span id="petwi"><output id="petwi"></output></span>
      <ruby id="petwi"></ruby>

      <span id="petwi"></span>
      <span id="petwi"><video id="petwi"></video></span>
        <ol id="petwi"></ol>

        <track id="petwi"><i id="petwi"></i></track>

      1. <span id="petwi"><sup id="petwi"></sup></span>
        <optgroup id="petwi"><em id="petwi"><del id="petwi"></del></em></optgroup>

            <legend id="petwi"><i id="petwi"></i></legend>

            1. <span id="petwi"></span>
              新聞內容

              關于android Socket通信中線程阻塞的問題解決

              信息來源:雙贊工控|時間:2017-02-15 20:34|瀏覽量:

              ?

              前言:關于Android的機制想必大家都了解, 為了避免運行一個時間長的function導致主進程阻塞,android上目前有兩個方案供我們選擇,一個是Thread .另一個則是Service.

              UI主線程運行在Activity里,如需根據子線程的新產生數據改變UI相關的內容,需要在Handler處理,一個線程是獨立于主線程的,原理上除非進程被殺死,或者用戶自己停止線程,該線程在進程運行過程中一直存在。

              如果不需要與用戶交互,甚至不需要和進程有交互,則開啟一個服務,這樣即使進程關閉后臺便可以幫我們輕松的處理類似下載,播放的功能。

              問題:這次遇到的問題是有關于線程的,

              我在這個線程中主要寫了和服務器的通信功能,系統運行,和服務器建立連接,然后服務器與客戶端進行數據的通信,線程一直接收,判斷是否有用戶請求,如果有,就發送,沒有,循環。

              之前缺乏通信方面的經驗,每次發請求,都建立一個連接,獲取數據后關閉連接,項目小的時候沒發現多大問題,項目大的時候,發現這樣效率極低,回想了下網絡的知識,這樣很不科學額,于是改寫了通信功能部分

              我發現我在線程中寫的循環只進行了幾次就無效了,我原本以為是Activity跳轉造成的,但是仔細看了SDK之后發現無關,我很詫異,在測試文件里另外寫了一個線程,證明和Activity跳轉。大家都知道,由于是線程的錯誤,調試啥的又 看不出所以然來。我花了不少時間,檢查服務器啥的。

              最后逐一注釋了功能模塊(發現注釋了紅色部分線程不出現阻塞),

              [java] view plain copy
               
              1. @Override  
              2. public void run() {  
              3.     // TODO Auto-generated method stub  
              4.     super.run();  
              5.     while (true) {  
              6.         Connect();  
              7.         count++;  
              8.         Log.v(TAG, "run" + count);  
              9.         if (Command.size() > 0) {  
              10.             try {  
              11.                 wtr = new PrintWriter(new OutputStreamWriter(  
              12.                         sk.getOutputStream(), "GBK"));  
              13.             } catch (UnsupportedEncodingException e) {  
              14.                 // TODO Auto-generated catch block  
              15.                 e.printStackTrace();  
              16.             } catch (IOException e) {  
              17.                 // TODO Auto-generated catch block  
              18.                 e.printStackTrace();  
              19.             }  
              20.             String send = Command.get(0);  
              21.             Log.v(TAG, "run/command" + send);  
              22.             if (send != null && send.length() > 0) {  
              23.                 wtr.println(send);  
              24.                 wtr.flush(); // 發送請求  
              25.             }  
              [java] view plain copy
               
              1. <span style="white-space: pre; ">     
              2. //<span style="white-space:pre">                </span>try {  
              3. //<span style="white-space:pre">                    </span>reader = new BufferedReader(new InputStreamReader(  
              4. //<span style="white-space:pre">                            </span>sk.getInputStream(), "gbk"));  
              5. //<span style="white-space:pre">                    </span>if (reader != null) {  
              6. //<span style="white-space:pre">                        </span>String str = reader.readLine();  
              7. //<span style="white-space:pre">                        </span>if (str.trim().length() > 0)  
              8. //<span style="white-space:pre">                            </span>SortReply.sort(str);  
              9. //<span style="white-space:pre">                    </span>}  
              10. //<span style="white-space:pre">                </span>} catch (IOException e) {  
              11. //<span style="white-space:pre">                    </span>// TODO Auto-generated catch block  
              12. //<span style="white-space:pre">                    </span>e.printStackTrace();  
              13. //<span style="white-space:pre">                </span>}<span style="color: rgb(255, 0, 0); "></span></span>  
              14.                 Command.remove(0);  
              15.             }  
              16.   
              17.             try {  
              18.                 sleep(2000);  
              19.             } catch (InterruptedException e) {  
              20.                 // TODO Auto-generated catch block  
              21.                 e.printStackTrace();  
              22.             }  
              23.   
              24.         }  
              25.     }  
              原因分析,一旦服務器端沒有數據發送數據給客戶端,客戶端就會阻塞在那里一直等待,導致線程無法繼續循環。

              問題找出來了解決辦法就簡單了,我在這個與服務器進行通信的線程的onCreate函數開啟一個接收數據流的線程,然后在它本身復寫的run函數中單純地發送請求,這樣保證了一個數據發送不會因為沒有收到數據包而阻塞,

              改寫后如下:

               

              [java] view plain copy
               
              1. <span style="font-family:monospace;">public Client() {  
              2.         Log.v(TAG, "cLINET");  
              3.         new getInputStreamThread().start();  
              4.   
              5.     }  
              6.   
              7.     public static void set_Req(Requests request) {  
              8.         Command.add(request.Command);  
              9.     }  
              10.   
              11.     private static void Connect() {  
              12.         if (sk == null) {  
              13.   
              14.             try {  
              15.                 sk = new Socket(ipStr, port);  
              16.             } catch (UnknownHostException e) {  
              17.                 // TODO Auto-generated catch block  
              18.                 e.printStackTrace();  
              19.             } catch (IOException e) {  
              20.                 // TODO Auto-generated catch block  
              21.                 e.printStackTrace();  
              22.             }  
              23.   
              24.         } else if (!sk.isConnected()) {  
              25.             try {  
              26.                 sk.connect(new InetSocketAddress(ipStr, port));  
              27.             } catch (IOException e) {  
              28.                 // TODO Auto-generated catch block  
              29.                 e.printStackTrace();  
              30.                 Log.v(TAG, "error:can not connect socket ");  
              31.             }  
              32.         }  
              33.     }  
              34.   
              35.     @Override  
              36.     public void run() {  
              37.         // TODO Auto-generated method stub  
              38.         super.run();  
              39.         while (true) {  
              40.             Connect();  
              41.             count++;  
              42.             Log.v(TAG, "run" + count);  
              43.             if (Command.size() > 0) {  
              44.                 try {  
              45.                     wtr = new PrintWriter(new OutputStreamWriter(  
              46.                             sk.getOutputStream(), "GBK"));  
              47.                 } catch (UnsupportedEncodingException e) {  
              48.                     // TODO Auto-generated catch block  
              49.                     e.printStackTrace();  
              50.                 } catch (IOException e) {  
              51.                     // TODO Auto-generated catch block  
              52.                     e.printStackTrace();  
              53.                 }  
              54.                 String send = Command.get(0);  
              55.                 Log.v(TAG, "run/command" + send);  
              56.                 if (send != null && send.length() > 0) {  
              57.                     wtr.println(send);  
              58.                     wtr.flush(); // 發送請求  
              59.                 }  
              60.                 Command.remove(0);  
              61.             }  
              62.   
              63.             try {  
              64.                 sleep(2000);  
              65.             } catch (InterruptedException e) {  
              66.                 // TODO Auto-generated catch block  
              67.                 e.printStackTrace();  
              68.             }  
              69.   
              70.         }  
              71.     }  
              72.   
              73.     public class getInputStreamThread extends Thread {  
              74.   
              75.         public int aa = 0;  
              76.   
              77.         @Override  
              78.         public void run() {  
              79.             // TODO Auto-generated method stub  
              80.             super.run();  
              81.             while (true) {  
              82.                 Connect();  
              83.                 aa++;  
              84.                 Log.v("getInputStreamThread""aa" + aa);  
              85.                 try {  
              86.                     reader = new BufferedReader(new InputStreamReader(  
              87.                             sk.getInputStream(), "gbk"));  
              88.                     if (reader != null) {  
              89.                         String str = reader.readLine();  
              90.                         if (str.trim().length() > 0)  
              91.                             SortReply.sort(str);  
              92.                     }  
              93.                 } catch (IOException e) {  
              94.                     // TODO Auto-generated catch block  
              95.                     e.printStackTrace();  
              96.                 }  
              97.   
              98.                 try {  
              99.                     sleep(3000);  
              100.                 } catch (InterruptedException e) {  
              101.                     // TODO Auto-generated catch block  
              102.                     e.printStackTrace();  
              103.                 }  
              104.   
              105.             }  
              106.   
              107.         }  
              108.     }  
              109. </span>  

              返回列表打印頁面

              上一篇:沒有了
              下一篇:音頻編碼之opus(一)
              久久这里只有热精品18_毛片免费看_免费毛片高清完整版_午夜一级成年大片在线无码