編輯:關於android開發
實際項目中有這麼一個問題,用戶進入詳情界面,那麼我們就要網絡加載數據並展現在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(異步任務)
如此,便可以有效及時的結束異步任務
自定義ZXing二維碼掃描界面並解決取景框拉伸等問題,zxing拉伸先看效果 掃描內容是下面這張,二維碼是用zxing庫生成的 由於改了好
看Facebook是如何優化React Native性能,facebookreact原文出處: facebook 譯文出處:@
改變Activity啟動時的默認動畫,activity默認動畫why 在開發中我們可能需要改變這一行為,一般基於2種理由: how 筆者所知道的主要有3種方式,下面我們
Android基礎入門教程——9.3 使用Camera拍照 Android基礎入門教程——9.3 使用Camera拍照 標簽(空格分隔): A