0

我在一个文件中有 1000 行,每次他/她加载应用程序时都会提供给用户。

我目前的做法是:

MainActivity: onCreate : 启动一个 AsyncTask

AsyncTask onPreExecute: 显示进度对话框

AsyncTask doInBackground: 检查键/值是否存在于 sharedpreferences 中,如果是,则在 doInBackground 中什么也不做。如果没有(第一次用户),从原始文件中读取并创建一个字符串构建器。将 StringBuilder 的内容作为键值对存储在 sharedpreferences 中。

AsyncTask onPostExecute: 从 sharedpreferences 填充 textview。关闭进度对话框。

在 doInBackground 方法中从文件中读取的代码是:

StringBuilder sb = new StringBuilder();
InputStream textStream = getBaseContext().getResources().openRawResource(R.raw.file);
BufferedReader bReader = new BufferedReader(new InputStreamReader(textStream));

String aJsonLine = null;
try {
    while ((aJsonLine = bReader.readLine()) != null) {
        sb.append(aJsonLine + System.getProperty("line.separator"));
    }
} catch (IOException e) {
    e.printStackTrace();
} finally{
    try {
        bReader.close();
        textStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我看到用户必须等待大约 9-10 秒才能首次启动,然后等待 4-5 秒才能进行后续启动。在我的情况下提高性能的任何建议。

4

3 回答 3

1

你不需要让你的用户等待整个列表被加载。一旦你有足够的数据填满屏幕(可能是 10-20 项?),用你已经拥有的数据填充屏幕列表或其他任何东西,这将使延迟完全不显着。

您可以查看http://developer.android.com/reference/android/content/AsyncTaskLoader.html以了解它应该如何完成。

于 2013-03-25T07:40:50.903 回答
1

作为其他评论的一个小补充,因为 aJsonLine 是一个字符串,所以最好使用两个 append() 而不是一个单独的 append() 将其值与换行符一起存储:

sb.append(aJsonLine);
sb.append(System.getProperty("line.separator"));

代替:

sb.append(aJsonLine + System.getProperty("line.separator"));

对于后者,aJsonLine 和 System.getProperty("line.separator")) 的结果都需要转换为 StringBuilder ,然后它们之间的连接才能发生,并且最终值作为参数传递。

当然,你也应该缓存System.getProperty("line.separator"))al的值

于 2013-03-25T07:17:56.930 回答
0

我宁愿通过JsonReader读取 JSON 流并提取我感兴趣的名称值对。字符串连接/垃圾收集是昂贵的操作。现在编写代码的方式,这些操作会减慢任务。代码中也存在效率低下的问题,例如在循环的每次迭代中访问行分隔符System.getProperty("line.separator")

仅使用JSONReader.

于 2013-03-25T06:14:59.997 回答