Throttle onQueryTextChange in SearchView

“限制”的最佳方法是什么,以便我的方法每秒仅调用一次,而不是每次用户键入时调用?onQueryTextChangeperformSearch()

public boolean onQueryTextChange(final String newText) {
    if (newText.length() > 3) {
        // throttle to call performSearch once every second
        performSearch(nextText);
    }
    return false;
}

答案 1

如果您使用的是 Kotlin 和协程,则可以执行以下操作:

var queryTextChangedJob: Job? = null

...

fun onQueryTextChange(query: String) {

    queryTextChangedJob?.cancel()
    
    queryTextChangedJob = launch(Dispatchers.Main) {
        delay(500)
        performSearch(query)
    }
}

答案 2

基于aherrick的代码,我有一个更好的解决方案。不要使用布尔值“canRun”,而是声明一个可运行的变量,并在每次更改查询文本时清除处理程序上的回调队列。这是我最终使用的代码:

@Override
public boolean onQueryTextChange(final String newText) {
    searchText = newText;

    // Remove all previous callbacks.
    handler.removeCallbacks(runnable);

    runnable = new Runnable() {
        @Override
        public void run() {
            // Your code here.
        }
    };
    handler.postDelayed(runnable, 500);

    return false;
}

推荐