【问题标题】:Android: offline dictionaryAndroid:离线字典
【发布时间】:2014-08-19 04:19:50
【问题描述】:

我正在开发一个离线存储数据库的字典应用程序。现在的问题是我正在使用自动完成文本视图来显示建议。当我输入建议时,应该加载。如果我不使用 AsyncTask,打字会变得非常慢并且会产生延迟。如果我使用 AsyncTask ,仍然需要花费太多时间从数据库加载建议。这意味着数据库搜索查询非常慢,并且不会快速显示结果。请帮助我,因为我已经坚持了很长时间。我的代码如下。提前致谢。

        autoComplete.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(final CharSequence s, int start,
                int before, int count) {
            new AsyncTask<Void, Void, Void>() {
                protected Void doInBackground(Void... params) {
                    results = db.getWords(s.toString());//arraylist
                    return null;
                }

                protected void onPostExecute(Void result) {
                    adapter.addAll(results);
                }
            }.execute();
        }

        @Override
        public void beforeTextChanged(final CharSequence s, int start,
                int count, int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            query.showDropDown();
        }

我在onTextChanged() 做所有事情。这是我用于搜索结果的 sqlite 查询。"SELECT WORD FROM tblWords WHERE Word LIKE '%s%%' GROUP BY Word LIMIT 5"。请注意,数据库非常大。谢谢。

【问题讨论】:

  • 只是好奇,你是在模拟器上还是在真正的安卓设备上测试这个?
  • 只是好奇:你知道you already have this project in your SDK samples folder吗?它被称为可搜索字典。版本 2 使用 db 而不是文本文件。
  • 只是澄清一下:你得到的结果是准确的,唯一的问题是它太慢了?到底有多慢?
  • 查看[Eclipse installation path]\sdk\samples\android-19\legacy\SearchableDictionary(似乎与[Eclipse installation path]\sdk\samples\android-8\SearchableDictionary相同)
  • ... 在您添加 support library v4 之前,该项目尚未完成(红色错误标记!),(可选?)将目标版本更改为 4.3(或 4.x,等等)和添加对app-compat-v7 的依赖。准备好了,开始吧。

标签: android database sqlite dictionary android-asynctask


【解决方案1】:

我注意到两件事:

您没有开始搜索的最小长度。我认为通常从 1 或 2 个字符开始搜索并没有多大意义,部分原因是你会得到太多的结果。它也有可能从 0 个字符开始搜索,因此它可能正在尝试将您的完整数据库添加到适配器。

我注意到的另一件事是,您永远不会清除适配器的集合,而只会添加所有内容。这也会使列表膨胀并产生不必要的结果。

最后一点与样式有关:我不会使用 addAll 方法,而是更新适配器使用的列表,然后在适配器上调用 notifyDataSetChanged()。我认为这只是风格,但也许它也会提高性能。

【讨论】:

  • Notifydatasetchanged() 不起作用,适配器显示计数 0,所以我使用了 addAll() 方法。由于我将查询结果限制为 5,它不会添加整个数据库。
猜你喜欢
  • 2018-01-31
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多