1. 程式人生 > >AsyncTask的cancel方法並沒有停止任務

AsyncTask的cancel方法並沒有停止任務

實際專案中有這麼一個問題,使用者進入詳情介面,那麼我們就要網路載入資料並展現在UI上,這個載入用執行緒或者非同步。

這裡就拿專案中統一用非同步任務來獲取網路資料把。

使用者可能會有這麼一個操作,它在一個商品(說說等)列表中,點選一個列表項,進入到相應的詳情介面,這時候,我們會開啟一個非同步任務來獲取網路資料,但是網路差的情況下, 使用者可能就不願意等了,立馬按後退按鈕回到列表,點選下一個別的列表項進入詳情介面,發現載入太慢,又按後退鍵,如此反覆,那麼就導致此時有多個非同步任務在執行,或者出現OOM問題,或者出現非同步任務等待問題。

那麼,作為開發者,我們對應的解決方案,便是在使用者在詳情介面按退出按鈕退回到上一個介面的時候,把沒有執行完的非同步任務給結束掉。

------------------------------------------------------------------------------------------------------------------------------

現在我們發現了這個問題,又有了解決方案。那麼就用程式碼來實現了。

那麼 取消非同步任務怎麼做?

我一開始這樣做,AsyncTask.cancel(true);

看下引數的定義:

@param mayInterruptIfRunning <tt>true</tt> if the thread executing this
* task should be interrupted; otherwise, in-progress tasks are allowed * to complete.

1、如果是true,如果執行緒執行,則會被打斷

2、如果是false,執行緒將會被執行執行完成

看到這,很顯然,我們以為.cancel(true)就會結束掉我們開啟的正在執行的非同步任務

但是實際上並沒有結束掉我們想要結束的非同步任務~~

看了些別人對此的解釋:

AsyncTask不會不考慮結果而直接結束一個執行緒。呼叫cancel()其實是給AsyncTask設定一個"
canceled"狀態。這取決於你去檢查AsyncTask是否已經取消,之後決定是否終止你的操作。對於mayInterruptIfRunning——它所作的只是向執行中的執行緒發出interrupt()呼叫。在這種情況下,你的執行緒是不可中斷的,也就不會終止該執行緒。

那麼該如何結束執行緒呢?

可見.cancel()是給AsyncTask設定一個"canceled"的狀態,那麼想要終止非同步任務,就需要在非同步任務當中結束。

複製程式碼
@Override
public void onProgressUpdate(Integer... value) {
// 判斷是否被取消
if(isCancelled()) return;
.........
}

@Override
protected Integer doInBackground(Void... mgs) {
// Task被取消了,馬上退出
if(isCancelled()) return null;
.......
// Task被取消了,馬上退出

if(isCancelled()) return null;
}
...
複製程式碼

另外結束非同步任務的條件:

複製程式碼
if(loadAsyncVedio!=null && !loadAsyncVedio.isCancelled()
                    && loadAsyncVedio.getStatus() == AsyncTask.Status.RUNNING){
                loadAsyncVedio.cancel(true);
                loadAsyncVedio = null;
            }
loadAsyncVedio(非同步任務)
複製程式碼

如此,便可以有效及時的結束非同步任務

相關推薦

AsyncTask的cancel方法沒有停止任務

實際專案中有這麼一個問題,使用者進入詳情介面,那麼我們就要網路載入資料並展現在UI上,這個載入用執行緒或者非同步。 這裡就拿專案中統一用非同步任務來獲取網路資料把。 使用者可能會有這麼一個操作,它在一個商品(說說等)列表中,點選一個列表項,進入到相應的詳情介面,這時候,我們會開啟一個非同步任務來獲取網路資料

android 通過bitmapfactory得到圖片真實像素的方法,以及沒有得到真實像素的原因

hdp hive eight bit font style 大小 () ica 原文來自:原文地址 由於這個錯誤導致浪費非常長時間找原因,所以要趕緊記錄下來。 過程是這種,在使用android讀取圖片的時候,就是使用BitmapFactory.dec

如何為CAD設置連續的尺寸?你找到設置的正確方法沒有

在繪制CAD的時候,經常需要連續的標註尺寸。那麽,如果想要連續的標註尺寸我們可以使用到什麽軟件呢,又該怎麽操作呢?連續標註尺寸可以為我們的圖紙帶來不一樣的東西,下面來看看標註尺寸的方法。 1.運行電腦上的迅捷CAD編輯器,打開軟件之後,點擊界面的“文件”選項,然後再點擊“打開”

今天tomcat啟動項目的時候不報錯而且啟動的很快,最後發現是tomcat部署項目的時候,沒有將一部分文件復制到tomcat的目錄下

img .com 右鍵 復制 添加 啟動 報錯 9.png 今天 解決辦法是   右鍵點擊項目 找到Properties 選中紅色框 然後找到右邊的add點擊 看看項目有哪些沒有復制過去 添加上去 就可以了 今天tomcat啟動項目的時候不報錯而且啟動的很快,最

Linux監聽進程是否存在,加入定時任務

cron spa /etc/ 內容 自己的 http 每天 scrip blank 前言 我們在linux主機上可能需要一直運行某一服務,如果關機後或者誤殺,使得服務停止,從而影響日常的任務。比如一BI項目數據庫的抽取,使用Taskctl調度,在每天固定時間進行數據的抽取,

00113_通過反射獲取成員方法使用

tor 執行指定 eth 演示 反射 println span 通過 font 1、在反射機制中,把類中的成員方法使用類Method表示; 2、通過Class類中提供的方法獲取成員方法:   (1)返回獲取一個方法 public Method getMethod(Stri

發、任務執行時間短的業務怎樣使用線程池?發不高、任務執行時間長的業務怎樣使用線程池?發高、業務執行時間長的業務怎樣使用線程池?

需要 span 業務 第一步 可能 family 執行時間 數據 並發 (1)高並發、任務執行時間短的業務,線程池線程數可以設置為CPU核數+1,減少線程上下文的切換(2)並發不高、任務執行時間長的業務要區分開看:a)假如是業務時間長集中在IO操作上,也就是IO密集型的任務

Java oop(一些自己的理解,沒有展開很細)

繼承 new .get 獲得 數量 語言 讀寫權限 訪問 setname 一下內容是自己總結用的,只是按照自己的理解去寫。參考的是菜鳥教程。Java 是一個面向對象的語言。OOP就是面向對象編程。封裝:在某些類裏面,某些屬性不想向外暴露,但是我們又想提供一個方法去訪問或修改

小米上市,現實很殘酷,沒有那麽多人暴富

data- 人在 bce off zax fab link 事情 alt 本文首發於微信公共號: 中產之路 我的最新思考都會更新這裏,你不妨關註一下 小米上市,那些年錯過了的可以暴富的工作機會 一文中京杭君感嘆 大部分初入職場的年輕人年富力強,當打之年因為眼界、格

為什麽pymysql執行SQL語句提示成功但實際沒有操作數據庫?

PyQt5 Python pymysql 開發環境:Anaconda3+PyCharm2018問題:使用pymysql插入數據提示成功,連接數據庫發現並沒有數據。原因:pymysql在連接數據庫的時候會有一個參數autocommit默認為False,表示執行完SQL語句後是否自動提交到真正的數據庫

js循環數據時綁定方法將數據對象傳遞出來

gif json response templet 對象 min msg title checkbox 代碼是參考的layui的作者 賢心 的代碼,其他的代碼太多了,看的tree中的代碼,雖然效果實現了,但是原理不是很清楚,因為涉及到閉包了,而我對於前段只知道基礎的東西,對

新建Maven項目建成後本應該有的src/main/java和src/test/java目錄沒有出現:

原本 pat alter rar 分享圖片 execution tps 新建 eclips 轉自:http://www.cnblogs.com/dong-dong-dong/p/9565466.html 新建Maven項目建成後本應該有的src/main/java和src/

除錯經驗——條條大路通羅馬(能用多種方法完成一件任務的重要性)

使用CitrixReciver訪問公司內網,發現密碼今天就要過期了(好險!)。 於是,使用首頁的“Change Password”連結,打不開。 無奈,在Webapp中搜索“change password”,找到了一個change password的新連結,但問題是,不能成功修改。

沒有專案任務的情況下、如何保持工作狀態(思考)

    轉正也快有了3個月了,前兩個被分配到公司比較老的一個專案組,jdk1.4…… 不過還是勤勤懇懇的完成任務。     最近一個月沒有什麼活,但是我不允許自己閒下來。只要有空,就會盡量系統的學習基礎知識,如JDK的原始碼、spring的複習、看國外

maven專案Java Resources 上面有個紅叉,但是程式碼裡面沒有什麼報錯

轉載自:https://www.cnblogs.com/achengmu/p/9106953.html   maven專案Java Resources 上面有個紅叉,但是程式碼裡面並沒有什麼報錯    解決辦法: 1.通過: windows

C++11 thread程式設計呼叫類方法傳入引數

#include <thread> #include <iostream> class classA { public : classA() { std::cout<<" classA " <<std::endl; }

EL表示式呼叫後臺方法傳遞引數

嘗試獲取後臺物件中帶引數的get方法返回的屬性值時,發現 J2EE6 開始支援EL表示式帶引數的呼叫後臺方法。   語法格式為: ${物件名.方法名(引數)}; 注意此處的方法名是方法全名,EL表示式並不會幫我們自動按照屬性名進行首字母大寫並在開頭拼接get三個字元來尋

Minimal Centos安裝後沒有ifconfig命令

首先,檢視ip addr ip addr 顯示如下: 進入下面的目錄,然後修改配置檔案 cd /etc/sysconfig/network-scripts vi ifcfg-ens33 將ONBOOT=no修改為yes,然後儲存,退出。 重新啟動網路服務 servi

appium 連結真機後,執行程式碼,但是APP沒有啟動

要淡定,連結真機後,問題一下多出來這麼多,還沒有啟動程式,就碰到接二連三的問題。 爽到家了。慢慢解決吧。 具體問題是這樣的: # coding=utf-8from appium import webdriverimport timefrom selenium.common.exceptions impo

微信小程式退出或隱藏後,內嵌的web-view的音訊沒有停止的幾種解決辦法

1.嘗試下通過h5的pagehide事件 2.小程式改變web-view src的hash值,網頁端監聽hashchange來處理 這均需要在h5去修改程式碼。 3.使用wx.pauseVoice() 4.注意的地方 wx.pauseVoice()介面主要用來實現暫停正在播放的語音。需要注意的是當再