在我們日常處理一些耗時任務的時候,有很多的方案,比如
1.可以通過handler().sendmessagedelayed() 達到延遲載入。
原理:將訊息加入佇列中,然後messagequeue會根據延時的時間進行佇列的排序,時間最短的在前,如果沒有要執行的,就進行阻塞,阻塞的時間為最先要執行的任務的等待時間,如果不再新增新任務,則等時間到了會自動執行,如果新增了新任務,則重新排序,然後喚醒當前執行緒,將排序後,最先要執行的等待時間進行阻塞或者直接執行。
缺點:但是專案中是不建議這樣用的,因為會強佔cpu,效能會進行耗損,比如乙個頁面的一些第三方服務進行初始化操作,雖然說是可以延遲一段時間再去初始化,但是如果該頁面一直在執行,比如有個定時器或者輪詢請求介面等,那麼到了時間,依然是要強佔cpu來執行我們的第三方服務的初始化操作。所以不能直接這麼用
2.ildehandler
這個的確能解決我們之前尷尬的問題,它的主張是在cpu空閒時再進行操作,不搶占cpu
同學們,面經是不是就只寫到這呀,那你們考慮過,如果請求過多尼,如果併發尼?如果空閒執行中執行的任務還必須有先後執行的順序尼。比如a頁面,b頁面都把自己耗時的方法加入到了空閒執行佇列裡面,但是要想執行b頁面耗時方法,必須得先執行頁面a中的方法,你該怎麼做?廢話不多說,直接上**,順便附一張之前戰鬥過的地方,專案雖好,但是工作室太「簡陋」,做完幾個版本就溜了。。
不知道task是啥的,就去看第三章內容。
/**
* @author: lybj
* @date: 2020/5/26
* @description: 空閒佇列
*/public class ildetaskdispatcher
// 如果返回false,則移除該 ildehandler
return !mildequeue.isempty();}};
public ildetaskdispatcher addtask(task task)
/*** 執行空閒方法,因為用了dispatchrunnable,所以會優先處理需要依賴的task,再處理本次需要處理的task,順序執行
* */
public void start()
}
呼叫的話也很簡單
不明白的,去看上一章的講解,這章本來就是在上一章內容上增加的拓展
dispatchrunnable
public class dispatchrunnable implements runnable
public dispatchrunnable(task task,taskdispatcher dispatcher)
@override
public void run()
if (!mtask.needcall() || !mtask.runonmainthread())
}tracecompat.endsection();}}
task
public abstract class task implements itask
/*** 當前task等待,讓依賴的task先執行
*/public void waittosatisfy() catch (interruptedexception e)
}/**
* 非同步執行緒執行的task是否需要在被呼叫await的時候等待,預設不需要
** @return
*/@override
public boolean needwait()
/*** 當前task依賴的task集合(需要等待被依賴的task執行完畢才能執行自己),預設沒有依賴
** @return
*/@override
public list> dependson()
}
自定義的task
public class initjpushtask extends task
@override
public list> dependson()
@override
public void run() catch (interruptedexception ex) }}
更優雅的延遲執行實現 環形佇列
在做業務時經常遇到某些一次性的延遲需求,比如新聞的定時發布,過了乙個時間閾值後某個任務的狀態置為超時或觸發某個介面。之前實現這種一次性的延遲需求基本會有3種思路。1 執行緒輪詢掃庫 2 timer類 3 定時框架quartz 這三種方案都存在各自的問題 對於 執行緒輪詢掃庫 效能開銷巨大,實時性差 ...
Web效能優化系列(3) 如何延遲載入JS
j ascript的延遲載入是那些在web上,能讓你想抓狂地去尋找解決方案的問題之一。很多人說 那就用defer 或 async程式設計客棧 甚至有些人說 ldquo那就將你的j ascript 放在頁面 底部 上述方法都不能解決在web頁面完全載入後,再載入外部js的問題。上述方法也會偶爾讓你收到...
APP效能優化系列 常見優化分析工具列舉
常用優化工具分析 查詢activity中的布局是否過於複雜 通過手機設定裡面的開發者選項,開啟show gpu overdraw的選項,可以觀察ui上的overdraw情況。方法跟蹤工具 traceview 記憶體分析工具,可以分析記憶體洩露 函式庫也是乙個很好的工具,它可以追蹤物件並確保它們不會洩...