Android執行緒操作類(暫停、重新開啟、停止)
阿新 • • 發佈:2019-01-05
場景:
在程式中如果需要在後臺長時間做一件事情,比如聯網獲取資料等操作,就要用到執行緒。
但為了提高使用者體驗,有以下幾點需要注意:
1、程式可見時執行緒開始執行;
2、程式不可見時執行緒暫停;
3、程式退出時停止執行緒;
以下根據我自己的程式提出一個公用的程式碼,大家可以把自己的業務邏輯套進去:
Java程式碼
注意:
執行緒的暫停用isPause控制,說白了其實就是不讓執行緒進入wait狀態;
在程式中如果需要在後臺長時間做一件事情,比如聯網獲取資料等操作,就要用到執行緒。
但為了提高使用者體驗,有以下幾點需要注意:
1、程式可見時執行緒開始執行;
2、程式不可見時執行緒暫停;
3、程式退出時停止執行緒;
以下根據我自己的程式提出一個公用的程式碼,大家可以把自己的業務邏輯套進去:
Java程式碼
- public class NetUtil2 extends Thread {
- //NewsBrief為新聞實體類;
-
private List<NewsBrief> loopList = new ArrayList<NewsBrief>();
- private boolean isClose = false;
- //IObtainData為一個介面,因為很多程式在用,因此拿Map儲存;
- private Map<Integer, IObtainData> obtainMap = new HashMap<Integer, IObtainData>();
- private int currentPage = 0;
- private boolean isPause = false;
- private NetUtil2() {
- }
-
private
- public synchronized static NetUtil2 getInstance() {
- if (single == null) {
- single = new NetUtil2();
- }
- return single;
- }
- public synchronized void addNewsBrief(NewsBrief newsBrief) {
-
loopList.add(newsBrief);
- //有資料要處理時喚醒執行緒
- this.notify();
- }
- public void setObtainDataListener(int channelId, IObtainData iod) {
- //添加回調
- if (!obtainMap.containsKey(channelId)) {
- obtainMap.put(channelId, iod);
- }
- }
- public void setCurrentPage(int page) {
- currentPage = page;
- }
- /**
- * 暫停執行緒
- */
- public synchronized void onThreadPause() {
- isPause = true;
- }
- /**
- * 執行緒等待,不提供給外部呼叫
- */
- private void onThreadWait() {
- try {
- synchronized (this) {
- this.wait();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 執行緒繼續執行
- */
- public synchronized void onThreadResume() {
- isPause = false;
- this.notify();
- }
- /**
- * 關閉執行緒
- */
- public synchronized void closeThread() {
- try {
- notify();
- setClose(true);
- interrupt();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public boolean isClose() {
- return isClose;
- }
- public void setClose(boolean isClose) {
- this.isClose = isClose;
- }
- @Override
- public void run() {
- while (!isClose && !isInterrupted()) {
- if (loopList.size() > 0 && !isPause) {
- int index = 0;
- NewsBrief newsBrief = null;
- // 當前頁面優先載入
- for (int i = 0; i < loopList.size(); i++) {
- if (loopList.get(i).getChannelId() == currentPage) {
- newsBrief = loopList.get(i);
- index = i;
- break;
- }
- }
- if (null == newsBrief) {
- newsBrief = loopList.get(0);
- }
- String reslut = getNewsContent(newsBrief);
- if (!"-1".equals(reslut)) {
- // 獲取成功,更新
- if (obtainMap.containsKey(newsBrief.getChannelId())) {
- obtainMap.get(newsBrief.getChannelId())
- .updateNewsBrief(newsBrief);
- }
- synchronized (loopList) {
- loopList.remove(index);
- }
- } else {
- //獲取失敗,移至隊尾
- synchronized (loopList) {
- NewsBrief nb = loopList.remove(index);
- loopList.add(nb);
- }
- }
- try {
- Thread.sleep(300);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- } else {
- onThreadWait();
- }
- }
- }
- }
注意:
執行緒的暫停用isPause控制,說白了其實就是不讓執行緒進入wait狀態;