APP效能優化系列 更優雅的延遲方案(四)

2021-10-10 14:01:42 字數 2460 閱讀 1453

在我們日常處理一些耗時任務的時候,有很多的方案,比如

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 記憶體分析工具,可以分析記憶體洩露 函式庫也是乙個很好的工具,它可以追蹤物件並確保它們不會洩...