【问题标题】:Dynamic Google-like search类似 Google 的动态搜索
【发布时间】:2012-05-26 04:21:26
【问题描述】:

我想实现一个类似于 google 的自动建议功能。最好的方法是什么?是否有任何已经实现的组件可以提供帮助?

我真的很担心应该多久发送一次请求。我的猜测是应该在一段时间后发送请求。因此,例如,当用户在一个新角色中写入时,必须触发某种计时器,到最后,它将触发一个函数,比较计时器开始和结束时的输入。根据比较判断是否发送。我应该为此使用线程吗?这不是资源密集型的执行吗?

还有一个选项:创建一个 while(true) 线程,它获取文本、发送请求和更新主线程结果视图。不过,我不确定它在 Android 方面是如何完成的。

感谢您的任何建议。

UPD:我想出了一个使用 AsyncTasks 的简单解决方案。每次启动新的 SearchInBackgroundTask 时,它都会设置一个标志,以防止启动 SearchInBackgroundTask 的任何其他实例,除非原始实例完成它的工作。设置标志后,它允许另一个 SearchInBackgroundTask 执行,如果最后一个输入字符串不为空且不等于先前处理的,则在条件下处理最后一个输入字符串。

那么,请提出任何想法 - 这是一个很好的解决方案吗?

public class AsyncTaskForSearchActivity extends Activity {

    protected boolean _threadIsWorking = false;
    protected String _searchResult;
    protected String _searchString;
    protected String _processedSearchString;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView searchbox = (TextView) findViewById(R.id.searchbox);
        searchbox.addTextChangedListener(_searchboxWatcher);
    }

    protected TextWatcher _searchboxWatcher = new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void afterTextChanged(Editable s) {
            _searchString = s.toString();
            if(_threadIsWorking == false){
                _performSearchTask();
            }
        }
    };

    protected Handler _onRetrieveResult = new Handler(){
        public void dispatchMessage(android.os.Message msg) {
            if(_threadIsWorking == false && _searchString.length() > 0 && _processedSearchString != _searchString){ // what's the difference bet equeals and ==
                _performSearchTask();
            }
        };
    };

    protected class SearchInBackgroundTask extends AsyncTask<String, Void, Void>{
        protected String _s;

        @Override
        protected Void doInBackground(String... params) {
            _s = params[0];
            try {
                // httpProvider -> retrieve
                Thread.sleep(6000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            _searchResult = "xxx";
            _threadIsWorking = false;
            _onRetrieveResult.sendEmptyMessage(0);
        }
    }

    protected void _performSearchTask(){
        _threadIsWorking = true;
        _processedSearchString = _searchString;
        Toast.makeText(AsyncTaskForSearchActivity.this, _processedSearchString, 1).show();
        (new SearchInBackgroundTask()).execute(_processedSearchString);
    }
}

【问题讨论】:

    标签: java android multithreading search


    【解决方案1】:

    事件驱动编程,加上“常见”搜索短语的 n 元树,是解决此问题的一种方法。

    【讨论】:

    • 嗯,我没有在我的应用程序中存储任何值。我需要做的就是向服务器发送请求。我需要制作一个计时器,并且可能会使用一些现有的组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多