WebPoolManager.ets
3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { BridgeWebViewControl } from "wdJsBridge"
import { AppUtils } from "wdKit"
import { createReuseableWeb, destoryReuseableWeb, getPoolWebNodeController, WebNodeController } from "./WebLocalPool"
import { createNWeb} from "./WebCommonPool"
import { util } from "@kit.ArkTS"
import { WebArticleEventHandler } from "./WebArticleEventHandler"
interface ArticleWebInterface {
uiContext: UIContext,
webSrc: string | Resource,
webController: BridgeWebViewControl
webArticleEventHandler: WebArticleEventHandler
}
const MAX_POOL_COUNT = 2
export class WebPoolManager {
private webTargets: string[] = []
private constructor() {
}
private static manager: WebPoolManager
static sharedInstance() : WebPoolManager {
if (!WebPoolManager.manager) {
WebPoolManager.manager = new WebPoolManager()
}
return WebPoolManager.manager
}
createArticleWeb(param: ArticleWebInterface, taking?: boolean) : string {
let target = util.generateRandomUUID()
createReuseableWeb(param.uiContext,
{src: param.webSrc, controller: param.webController, renderMode: RenderMode.SYNC_RENDER},
target,
800,
param.webArticleEventHandler
)
if (taking != true && this.webTargets.length < MAX_POOL_COUNT) {
this.webTargets.push(target)
}
return target
}
createHuaWeiWeb(uiContext: UIContext){
createNWeb('https://privacy.consumer.huawei.com/legal/id/authentication-terms.htm?code=CN&language=zh-CN', uiContext)
}
// 取一个可用的target,不存在则根据参数创建
// 当使用完成,需要调用recycleTarget()
takeAvaiableArticleWebTarget(param: ArticleWebInterface): string {
if (this.webTargets.length) {
let target = this.webTargets.splice(0, 1).pop()!
// 当pool里没有缓存,主动提前加载一个
if (this.webTargets.length == 0) {
setTimeout(() => {
this.createArticleWeb(param)
}, 500)
}
return target
}
return this.createArticleWeb(param, true)
}
// 回收target
recycleTarget(target: string) {
let nodeController = getPoolWebNodeController(target)
if (!nodeController) {
let index = this.webTargets.indexOf(target)
if (index >= 0) {
this.webTargets.splice(index, 1)
}
return
}
if (this.webTargets.length < MAX_POOL_COUNT) {
if (nodeController.prepareForReuse() == true) {
this.webTargets.push(target)
return
}
}
this.destoryTarget(target)
}
// 撤底销毁
destoryTarget(target: string) {
destoryReuseableWeb(target)
let index = this.webTargets.indexOf(target)
if (index >= 0) {
this.webTargets.splice(index, 1)
}
}
getWebNodeController(target: string) : WebNodeController | undefined {
return getPoolWebNodeController(target)
}
getWebController(target: string) : BridgeWebViewControl | undefined {
return getPoolWebNodeController(target)?.webOption.controller as BridgeWebViewControl
}
getWebEventHandler(target: string) : WebArticleEventHandler | undefined {
return getPoolWebNodeController(target)?.webEvents as WebArticleEventHandler
}
}