【发布时间】:2018-11-18 23:19:55
【问题描述】:
我的资产文件夹中有一个文本文件,其中大约有 15000 行,我想遍历每一行,我使用 BufferedReader 应用了逻辑,但是遍历每一行需要很长时间(1 分钟+) .
现在我需要减少阅读每一行的时间以最大化用户体验。
AsyncTask<Void, String, Void> asyncTask = new AsyncTask<Void, String, Void>() {
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
appBarLayout.setVisibility(View.VISIBLE);
viewpager.setVisibility(View.VISIBLE);
splashScreen.setVisibility(View.GONE);
gamesLoaded = true;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
makeRandomText(gameRandomText, "Random Text" + new Random().nextInt(1000));
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
gamePercentage.setText(values[0]);
}
@Override
protected Void doInBackground(Void... voids) {
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("games.txt"), "UTF-8"));
int startingCount = 0;
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
Game gameAdded = new Game(mLine);
addGame(database, gameAdded);
startingCount++;
String percentage = startingCount * 100 / Constants.GAMES_COUNT + "%";
publishProgress(percentage);
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
return null;
}
};
【问题讨论】:
-
字符串去哪儿了,是数据库表还是内存类?每次游戏冷启动时都会发生这种情况吗?
-
房间数据库,但我真的不认为这是原因,因为我尝试删除此行并重复该过程,它花了大约同一时间
-
如果@kiskae 回答不能解决您的问题:我建议Shipping an application with a pre-populated database,但看起来Room 并不特别支持这种行为:Room library can copy db from asset folder?
-
publishProgress(percentage)的代码是什么以及您更新 UI 的频率(即 15000 次更新没有用,使 UI 更新有条件) -
publishProgress 触发 onProgressUpdate,它恰好更新我的百分比以通知用户。根据文档:“onProgressUpdate(Progress...),在调用 publishProgress(Progress...) 后在 UI 线程上调用。执行的时间未定义。此方法用于显示任何形式的进度后台计算仍在执行时的用户界面。例如,它可用于动画进度条或在文本字段中显示日志。"
标签: java android bufferedreader