0

所以我有这个编辑框,它可以在 data.txt 中搜索 stopname 并使用我的自定义适配器将其显示到列表视图中,所以每次我输入一个单词时,它都会过滤结果。

我的问题是当我再次输入一个单词时它有点滞后,因为我认为它过滤了所有结果。

我的问题是如何让它不滞后我知道我有没有办法在后台过滤数据?

PS。我的 data.txt 是一个非常大的数据集合,比如说 100mb 的停止名称数据

searchEditText2.addTextChangedListener(new TextWatcher(){

            @Override
            public void afterTextChanged(Editable arg0) {
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {
            }

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2,
                    int arg3) {

                customAdapter.getFilter().filter(cs);

            }

        });
4

2 回答 2

2

我建议你先显示一些特定的词,然后可能会在滚动显示下一个搜索结果,甚至在加载更多按钮上单击显示更多记录。一次显示如此庞大的数据可能是不正确的。考虑到不同的安卓设备和处理器速度,有些设备可能根本没有响应。

于 2013-10-05T06:47:45.550 回答
1

由于您需要在一个巨大的文件中进行搜索,并且将其全部放入堆内存中太危险了(可能会导致 OOM),您可以做以下事情来让事情变得更好:

  1. 将文件加载到 JNI 代码中并在那里进行搜索。确保它会花费一些加载时间并占用内存,并且会使操作系统在进入后台时更愿意杀死您的进程,但它会快得多。

  2. 缓存以前的结果

  3. 压缩文件,以便更多的工作将在 CPU 而不是存储单元上。

  4. 根据数据和查询,想出一种更好的方法来帮助搜索。因为我对数据或查询一无所知,所以我不能更具体。例如,如果所有文本都是英文,您可以使用 ascii 代替 unicode,因此每个字符将占用一个字节而不是 2 个字节。

  5. 如果它很慢,你甚至可以把它放在远程服务器上并从设备上查询它。在那里,您可以将其全部加载到内存中,并随时准备好进行查询。

  6. 您可以使用某种搜索算法对您的数据进行处理,以加快搜索速度。我认为 KMP 算法似乎还可以。我认为这里有一个很好的实现(没有测试它)。有一段视频描述了它是如何工作。也许您不必这样做,因为如何搜索字符串的内置实现已经非常有效,所以只有在您尝试过其他解决方案时才这样做。

    另外,我认为正则表达式可以达到同样的效果。

无论您选择哪一个,请记住,与完整的 PC 相比,它仍然是低规格设备,因此请注意 RAM 的使用,否则您将在某些设备上获得 OOM。

于 2013-10-05T09:02:38.183 回答