Android活动冻结时,从数据库搜索



我有一个texttwatcher为我的editText。思路是:

我有两个列表视图,它们都在editText字段字符插入后更新。不知何故,我不能实现这个使用标准的ArrayAdapter与过滤器方法。所以我必须对搜索有自己的认识。一开始看起来还不错,但当我向数据库中添加更多更少的数据时,界面开始冻结。

这是调用

inputSearch.addTextChangedListener(createAndReturnTextWatcher());

这个方法创建并返回textWatcher

private TextWatcher createAndReturnTextWatcher() {
    final List<String> list = dbExtractor.getDataForSearchAdapters();
    TextWatcher watcher1;
    watcher1 = new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            if (cs.length() == 0) {
                lv.setAdapter(null);
                lv2.setAdapter(null);
                dc.clickedOnce = true;
                dc.decrement();
                dc.checkDimCounter();
            } else {

                setSecondListData(list, String.valueOf(cs));
                setFirstListData(list, String.valueOf(cs));
                if (dc.clickedOnce) {
                    dc.increment();
                    dc.checkDimCounter();
                    dc.clickedOnce = false;
                }
            }
        }
        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
        }
        @Override
        public void afterTextChanged(Editable arg0) {
        }
    };
    return watcher1;
}

这些是执行过滤的方法

private void setSecondListData(List<String> inputData, String cs) {
    List<String> result = turkishSearcher.performFiltering(inputData, cs);
    ArrayAdapter turkAdapt = new ArrayAdapter(this, R.layout.dictionary_list_item, R.id.product_name,
            result);
    lv2.setAdapter(turkAdapt);
}
private void setFirstListData(List<String> inputData, String cs) {
    List<String> result = normSearcher.performFiltering(inputData, cs);
    ArrayAdapter turkAdapt = new ArrayAdapter(this, R.layout.dictionary_list_item, R.id.product_name,
            result);
    lv.setAdapter(turkAdapt);
}

这是过滤数据的类

public class TurkishSearcher extends Searcher{
@Override
int returnPosition() {
    return 1;
}
@Override
String reverse(String couples) {
    java.lang.String[] arr = couples.split(" — ");
    return arr[1]+ " — " + arr[0];
}
@Override
String replaceTurkish(String words) {
    if (checkWithRegExp(words)) {
        return words.toLowerCase().replaceAll("ç", "c").replaceAll("ğ", "g").replaceAll("ı", "i").
                replaceAll("ö", "o").replaceAll("ş", "s").replaceAll("ü", "u");
    } else return words;
}
public static boolean checkWithRegExp(String word){
    Pattern p = Pattern.compile("[öçğışü]", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(word);
    return m.find();
}

}

我清楚地知道我保存数据的方式是错误的,搜索算法也不好。但我的问题是:

在搜索实现中使用线程是否可能避免冻结?我可以把两个搜索器放在自己的线程中以避免界面冻结吗?如果可能的话,请告诉我代码中我可以使用线程的最佳位置。

提前感谢!

绝不应该通过数据库操作阻塞主线程。而是使用:

     new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... unusedParams) {
            // TODO: do your database stuff
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            // TODO: refresh UI elements, because thread finished
            super.onPostExecute(aVoid);
        }
    }.execute();

在后台线程中执行长任务的最佳方式。你可以使用asynctask来完成这个任务

相关内容

  • 没有找到相关文章

最新更新