优化 findOnce()和findOne()等的效率

This commit is contained in:
hyb1996
2018-11-30 13:41:51 +08:00
parent 9d30996ae8
commit ada179690b
16 changed files with 112 additions and 93 deletions

View File

@@ -186,172 +186,172 @@ open class UiGlobalSelector {
//// 第二类筛选条件 -able
fun checkable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CHECKABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.CHECKABLE, b])
return this
}
fun checked(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CHECKED, b))
mFilters.add(BooleanFilter[BooleanFilter.CHECKED, b])
return this
}
fun focusable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.FOCUSABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.FOCUSABLE, b])
return this
}
fun focused(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.FOCUSED, b))
mFilters.add(BooleanFilter[BooleanFilter.FOCUSED, b])
return this
}
fun visibleToUser(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.VISIBLE_TO_USER, b))
mFilters.add(BooleanFilter[BooleanFilter.VISIBLE_TO_USER, b])
return this
}
fun accessibilityFocused(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.ACCESSIBILITY_FOCUSED, b))
mFilters.add(BooleanFilter[BooleanFilter.ACCESSIBILITY_FOCUSED, b])
return this
}
fun selected(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.SELECTED, b))
mFilters.add(BooleanFilter[BooleanFilter.SELECTED, b])
return this
}
fun clickable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CLICKABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.CLICKABLE, b])
return this
}
fun longClickable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.LONG_CLICKABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.LONG_CLICKABLE, b])
return this
}
fun enabled(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.ENABLED, b))
mFilters.add(BooleanFilter[BooleanFilter.ENABLED, b])
return this
}
fun password(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.PASSWORD, b))
mFilters.add(BooleanFilter[BooleanFilter.PASSWORD, b])
return this
}
fun scrollable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.SCROLLABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.SCROLLABLE, b])
return this
}
fun editable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.EDITABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.EDITABLE, b])
return this
}
fun contentInvalid(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CONTENT_INVALID, b))
mFilters.add(BooleanFilter[BooleanFilter.CONTENT_INVALID, b])
return this
}
fun contextClickable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CONTEXT_CLICKABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.CONTEXT_CLICKABLE, b])
return this
}
fun multiLine(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.MULTI_LINE, b))
mFilters.add(BooleanFilter[BooleanFilter.MULTI_LINE, b])
return this
}
fun dismissable(b: Boolean): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.DISMISSABLE, b))
mFilters.add(BooleanFilter[BooleanFilter.DISMISSABLE, b])
return this
}
fun checkable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CHECKABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.CHECKABLE, true])
return this
}
fun checked(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CHECKED, true))
mFilters.add(BooleanFilter[BooleanFilter.CHECKED, true])
return this
}
fun focusable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.FOCUSABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.FOCUSABLE, true])
return this
}
fun focused(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.FOCUSED, true))
mFilters.add(BooleanFilter[BooleanFilter.FOCUSED, true])
return this
}
fun visibleToUser(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.VISIBLE_TO_USER, true))
mFilters.add(BooleanFilter[BooleanFilter.VISIBLE_TO_USER, true])
return this
}
fun accessibilityFocused(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.ACCESSIBILITY_FOCUSED, true))
mFilters.add(BooleanFilter[BooleanFilter.ACCESSIBILITY_FOCUSED, true])
return this
}
fun selected(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.SELECTED, true))
mFilters.add(BooleanFilter[BooleanFilter.SELECTED, true])
return this
}
fun clickable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CLICKABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.CLICKABLE, true])
return this
}
fun longClickable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.LONG_CLICKABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.LONG_CLICKABLE, true])
return this
}
fun enabled(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.ENABLED, true))
mFilters.add(BooleanFilter[BooleanFilter.ENABLED, true])
return this
}
fun password(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.PASSWORD, true))
mFilters.add(BooleanFilter[BooleanFilter.PASSWORD, true])
return this
}
fun scrollable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.SCROLLABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.SCROLLABLE, true])
return this
}
fun editable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.EDITABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.EDITABLE, true])
return this
}
fun contentInvalid(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CONTENT_INVALID, true))
mFilters.add(BooleanFilter[BooleanFilter.CONTENT_INVALID, true])
return this
}
fun contextClickable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.CONTEXT_CLICKABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.CONTEXT_CLICKABLE, true])
return this
}
fun multiLine(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.MULTI_LINE, true))
mFilters.add(BooleanFilter[BooleanFilter.MULTI_LINE, true])
return this
}
fun dismissable(): UiGlobalSelector {
mFilters.add(BooleanFilter.get(BooleanFilter.DISMISSABLE, true))
mFilters.add(BooleanFilter[BooleanFilter.DISMISSABLE, true])
return this
}
@@ -401,30 +401,36 @@ open class UiGlobalSelector {
fun filter(filter: BooleanFilter.BooleanSupplier): UiGlobalSelector {
mFilters.add(object : DfsFilter() {
override fun isIncluded(nodeInfo: UiObject): Boolean {
return filter.get(nodeInfo)
return filter[nodeInfo]
}
})
return this
}
fun findOf(node: UiObject): UiObjectCollection {
return UiObjectCollection.of(findAndReturnList(node))
fun findOf(node: UiObject, max: Int): UiObjectCollection {
return UiObjectCollection.of(findAndReturnList(node, max))
}
fun findAndReturnList(node: UiObject): List<UiObject> {
fun findOf(node: UiObject): UiObjectCollection {
return findOf(node, Int.MAX_VALUE)
}
fun findAndReturnList(node: UiObject, max: Int = Int.MAX_VALUE): List<UiObject> {
var list: List<UiObject> = listOf(node)
for (filter in mFilters) {
val oldMax = filter.maxCount
filter.maxCount = max
list = filter.filter(list)
filter.maxCount = oldMax
}
return list
}
fun findOneOf(node: UiObject): UiObject? {
// TODO: 2017/3/9 优化
val collection = findOf(node)
val collection = findOf(node, 1)
return if (collection.size() == 0) {
null
} else collection.get(0)
} else collection[0]
}
fun addFilter(filter: ListFilter): UiGlobalSelector {

View File

@@ -16,6 +16,9 @@ abstract class DfsFilter : ListFilter(), Filter {
if (isIncluded(node)) {
list.add(node)
}
if (list.size >= maxCount) {
break
}
filterChildren(node, list)
}
return list
@@ -26,6 +29,9 @@ abstract class DfsFilter : ListFilter(), Filter {
if (isIncluded(node)) {
list.add(node)
}
if (list.size >= maxCount) {
return list
}
filterChildren(node, list)
return list
}
@@ -37,6 +43,9 @@ abstract class DfsFilter : ListFilter(), Filter {
if (included) {
list.add(child)
}
if (list.size >= maxCount) {
break
}
filterChildren(child, list)
if (!included) {
child.recycle()

View File

@@ -20,7 +20,7 @@ abstract class ListFilter {
val list = ArrayList<UiObject>()
for (node in nodes) {
list.addAll(filter(node))
if (list.size > maxCount) {
if (list.size >= maxCount) {
break
}
}