1. 程式人生 > >Android執行緒操作類(暫停、重新開啟、停止)

Android執行緒操作類(暫停、重新開啟、停止)

場景: 
在程式中如果需要在後臺長時間做一件事情,比如聯網獲取資料等操作,就要用到執行緒。 
但為了提高使用者體驗,有以下幾點需要注意: 
1、程式可見時執行緒開始執行; 
2、程式不可見時執行緒暫停; 
3、程式退出時停止執行緒; 

以下根據我自己的程式提出一個公用的程式碼,大家可以把自己的業務邏輯套進去: 

Java程式碼  收藏程式碼
  1. public class NetUtil2 extends Thread {  
  2.     //NewsBrief為新聞實體類;  
  3.     private List<NewsBrief> loopList = new ArrayList<NewsBrief>();  
  4.     private boolean isClose = false;  
  5.     //IObtainData為一個介面,因為很多程式在用,因此拿Map儲存;  
  6.     private Map<Integer, IObtainData> obtainMap = new HashMap<Integer, IObtainData>();  
  7.     private int currentPage = 0;  
  8.     private boolean isPause = false;  
  9.     private NetUtil2() {  
  10.     }  
  11.     private
     static NetUtil2 single = null;  
  12.     public synchronized static NetUtil2 getInstance() {  
  13.         if (single == null) {  
  14.             single = new NetUtil2();  
  15.         }  
  16.         return single;  
  17.     }  
  18.     public synchronized void addNewsBrief(NewsBrief newsBrief) {  
  19.         loopList.add(newsBrief);  
  20.         //有資料要處理時喚醒執行緒  
  21.         this.notify();  
  22.     }  
  23.     public void setObtainDataListener(int channelId, IObtainData iod) {  
  24.         //添加回調  
  25.         if (!obtainMap.containsKey(channelId)) {  
  26.             obtainMap.put(channelId, iod);  
  27.         }  
  28.     }  
  29.     public void setCurrentPage(int page) {  
  30.         currentPage = page;  
  31.     }  
  32.     /** 
  33.      * 暫停執行緒 
  34.      */  
  35.     public synchronized void onThreadPause() {  
  36.         isPause = true;  
  37.     }  
  38.     /** 
  39.      * 執行緒等待,不提供給外部呼叫 
  40.      */  
  41.     private void onThreadWait() {  
  42.         try {  
  43.             synchronized (this) {  
  44.                 this.wait();  
  45.             }  
  46.         } catch (Exception e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  
  50.     /** 
  51.      * 執行緒繼續執行 
  52.      */  
  53.     public synchronized void onThreadResume() {  
  54.         isPause = false;  
  55.         this.notify();  
  56.     }  
  57.     /** 
  58.      * 關閉執行緒 
  59.      */  
  60.     public synchronized void closeThread() {  
  61.         try {  
  62.             notify();  
  63.             setClose(true);  
  64.             interrupt();  
  65.         } catch (Exception e) {  
  66.             e.printStackTrace();  
  67.         }  
  68.     }  
  69.     public boolean isClose() {  
  70.         return isClose;  
  71.     }  
  72.     public void setClose(boolean isClose) {  
  73.         this.isClose = isClose;  
  74.     }  
  75.     @Override  
  76.     public void run() {  
  77.         while (!isClose && !isInterrupted()) {  
  78.             if (loopList.size() > 0 && !isPause) {  
  79.                 int index = 0;  
  80.                 NewsBrief newsBrief = null;  
  81.                 // 當前頁面優先載入  
  82.                 for (int i = 0; i < loopList.size(); i++) {  
  83.                     if (loopList.get(i).getChannelId() == currentPage) {  
  84.                         newsBrief = loopList.get(i);  
  85.                         index = i;  
  86.                         break;  
  87.                     }  
  88.                 }  
  89.                 if (null == newsBrief) {  
  90.                     newsBrief = loopList.get(0);  
  91.                 }  
  92.                 String reslut = getNewsContent(newsBrief);  
  93.                 if (!"-1".equals(reslut)) {  
  94.                     // 獲取成功,更新  
  95.                     if (obtainMap.containsKey(newsBrief.getChannelId())) {  
  96.                         obtainMap.get(newsBrief.getChannelId())  
  97.                                 .updateNewsBrief(newsBrief);  
  98.                     }  
  99.                     synchronized (loopList) {  
  100.                         loopList.remove(index);  
  101.                     }  
  102.                 } else {  
  103.                     //獲取失敗,移至隊尾  
  104.                     synchronized (loopList) {  
  105.                         NewsBrief nb = loopList.remove(index);  
  106.                         loopList.add(nb);  
  107.                     }  
  108.                 }  
  109.                 try {  
  110.                     Thread.sleep(300);  
  111.                 } catch (InterruptedException e) {  
  112.                     e.printStackTrace();  
  113.                 }  
  114.             } else {  
  115.                 onThreadWait();  
  116.             }  
  117.         }  
  118.     }  
  119. }  


注意: 
執行緒的暫停用isPause控制,說白了其實就是不讓執行緒進入wait狀態;