【问题标题】:Android - Strings.xml versus text files. Which is faster?Android - Strings.xml 与文本文件。哪个更快?
【发布时间】:2013-02-28 12:16:58
【问题描述】:

我有一个字典数据库,它总共包含 99,833 个单词,但每个字母分开。 我正在测试包含 3922 个单词的 dictionaryA.txt。

案例一:

当我输入一个我想查找的单词时,让我们说“算盘”, 使用缓冲阅读器,我的应用程序显示“论文没有响应。等待 - 退出”。如果我选择等待,它将返回单词 abacus 及其定义。

代码:

InputStream inputStream = getResources().openRawResource(R.raw.definitiona); 
                    try {
                        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
                        String s = in.readLine();
                        String delimiter = " - ";
                        String del[];
                        while(s != null)
                        {
                            s = in.readLine().replaceAll("\\s+", " ");
                            del = s.split(delimiter);
                            if (enhancedStem.equals(del[0]))
                            {
                                in.close();
                                databaseOutput.setText(s);
                                break;
                            }                        
                        }
                        in.close();
                        }
                    catch (FileNotFoundException e) {
                        databaseOutput.setText("" + e);
                    }
                    catch (IOException e1) {
                        databaseOutput.setText("" + e1);
                    }

案例 2:

当我输入一个我想查找的单词时,让我们说“算盘”, 使用strings.xml(我在一个字符串数组中传输了整个3922个单词),它说的是一样的。我必须在它响应之前点击等待。

代码:

String[] wordA = getResources().getStringArray(R.array.DictionaryA);
                String delimiter = " - ";
                String[] del;
                for (int wordActr = 0; wordActr <= wordA.length - 1; wordActr++)
                {
                    String wordString = wordA[wordActr].toString();
                    del = wordString.split(delimiter);

                    if (enhancedStem.equals(del[0]))
                    {
                        databaseOutput.setText(wordA[wordActr]);
                        break;
                    }
                    else
                        databaseOutput.setText("Word not found!");

                }

你能告诉我哪个更好吗?我应该继续使用我的文本文件吗?或者将它们转移到strings.xml,因为它们都响应缓慢?您知道如何消除“无响应”问题吗? 提前致谢!

【问题讨论】:

  • 这并不奇怪,问题是,您通过在 UI 线程上执行繁重的工作来冻结 UI。
  • 您应该使用实际的 SQLite 数据库,而不是文本文件或 strings.xml。
  • 你需要实现一个异步任务来完成繁重的工作,因为无论你做什么,你都有可能得到 ANR。在处理请求时显示进度视图,然后使用结果更新视图。
  • @VX - 嗨!我更新了代码。
  • @Raghav - 我也想使用 SQLite,因为我读到它是最好的方法,但我真的没有时间了。不熟悉 SQL 代码,而且我没有字典的 sql 数据库。

标签: android text-files arrays notepad


【解决方案1】:

与文本文件相比,使用 Xml 的主要优点是

  1. 如果具有明确定义的结构,那么解析它是一件容易的事。
  2. 您还可以为 xml 定义架构,这样您就可以很容易地遍历 xml,它变得类型安全。
  3. 更好的性能。
  4. 更可靠。

所以最好使用 xml ...

【讨论】:

  • 谢谢!那我就用xml方法吧! :)
【解决方案2】:

您遇到等待消息是因为您在主线程中执行了繁重的操作。您可以使用ThreadsAsyncTask 消除等待消息

Google 建议在与您类似的用例中使用 strings.xml

【讨论】:

  • 感谢您的回复!我会检查链接!
【解决方案3】:

如果您显示一些代码,这会更容易。我的第一个猜测是,由于您的 UI 没有响应,因此您正在 UI 线程上执行“搜索任务”。在 UI 线程上执行繁重的任务通常不是一个好主意,相反,您应该研究 AsyncTasks、Threads 或其他任何最适合的东西。 通过在后台执行任务,用户仍然可以与您的应用程序交互 - 例如,如果他在搜索中出现拼写错误或根本不再关心,则停止搜索任务。在搜索完成并获取结果之前,您可以简单地显示某种等待对话框。

我不知道你的两个建议中哪一个更快。您可以创建两个线程,都以一种方式执行并测量时间。

【讨论】:

  • 您好!我更新了代码。感谢您的信息。我认为这就是我正在做的事情,因为我没有放置任何关于线程和 AsyncTasks 的代码。我会在网站上检查如何做到这一点。谢谢!
【解决方案4】:

99,833 个单词可以存储在不到 2 MB 的空间中

在那种情况下最快的就是保存在内存中,所以情况 3 :)

【讨论】:

  • 你能告诉我如何将它缩小到 2 mb 吗?
  • 全部读入 ArrayList 或其他集合,也许你需要一个键值对:Hashtable 或类似的东西,非同步版本比同步版本快。为了持久存储,我会使用二进制文件,并且肯定不是 xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多