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()介面主要用來實現暫停正在播放的語音。需要注意的是當再