Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 自动搜索用户类型大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@L_874_0@一个Activity,其中用户键入EditText,点击搜索按钮,应用程序查询Web服务并将结果放在ListView中.

我想取消搜索按钮.

显然,我不希望用户输入的每个字符都能访问Web服务.我想只在用户输入完成后执行1个Web服务调用.

我实现这一点的方式是这样的

@L_874_0@一个成员变量,它包含一个AsyncTask.当EditText中的文本发生更改时,AsyncTask将触发.在doInBACkground()内部,调用Thread.sleep().这个休眠期基本上是一个等待查看用户是否输入任何其他内容的计时器.在睡眠调用之后,如果尚未取消AsyncTask,则会调用Web服务.如果用户键入另一个字母,则在AsyncTask上调用cancel()(以阻止调用Web服务),将保存AsyncTask的成员变量设置为null,并创建AsyncTask的新实例.

在这里有几个问题:我是否泄漏记忆?这在任何方面都特别糟糕吗?我知道它可能效率不高,但我是否会严重减慢某人的电话速度?有没有更好的方法呢?

private SearchTask mSearchTask = null;

@H_577_12@mSearchText.addTextChangedListener(new TextWatcher() { public void ontextChanged(CharSequence s,int start,int before,int count) { // Auto-generated method stub } public void beforeTextChanged(CharSequence s,int count,@R_489_8237@fter) { // Auto-generated method stub } public void afterTextChanged(Editable s) { if (s != null && s.length() > 0) { // stop any current search thread if (mSearchTask != null && !mSearchTask.isCancelled()) { mSearchTask.cancel(false); } // search for products SearchCriteria crit = new SearchCriteria(); crit.strSearchWord = mSearchText.getText().toString().trim(); mSearchTask = null; mSearchTask = new SearchTask(); mSearchTask.execute(crit); } } });

private class SearchTask extends AsyncTask<SearchCriteria,Integer,Boolean> {
    protected Boolean doInBACkground(SearchCriteria... params) {
        SearchCriteria crit = null;
        if (params.length > 0) {
            crit = params[0];

            if (crit != null) {
                try {
                    Thread.sleep(1000L);
                    if (!isCancelled()) {
                        // perform search
                        return true;
                    }
                }
                catch(Exception E) {
                }
            }
        }

        return false;
    }

    protected void onPostExecute(Boolean success) {
        if (success != null && success == truE) {
            // do something
        }
        else {
            // do something else
        }
    }   
}

解决方法

我会更愿意在x毫秒内启动一个线程然后进行检查,而不是立即启动线程并在那里进行休眠.
private Handler mmessageHandler = new Handler();

private Runnable mSearchRunnable = new Runnable() {
        public void run() {
           if (!isCancelled()) {
               // perform search
           }
        }
    };

那么你可以在AfterTextChanged后把它放在你身上:

@H_577_12@mmessageHandler.postDelayed(mSearchRunnable,1000);

然后,如果用户输入更多数据,您可以取消该线程:

@H_577_12@mmessageHandler.removeCallBACks(mSearchRunnablE);

大佬总结

以上是大佬教程为你收集整理的android – 自动搜索用户类型全部内容,希望文章能够帮你解决android – 自动搜索用户类型所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。