检查仓库https://github.com/vivekpanchal/BabyApp
我正在读取数据并像这样更新适配器
CSV文件位于Raw文件夹中的存储库中
想要帮助处理CSV数据
private void readData() {
InputStream is = getResources().openRawResource(R.raw.babynames);
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, Charset.forName("UTF-8"))
);
String line = "";
try {
reader.readLine();
String mGender,mMeaning,mName,mOrigin;
while ((line = reader.readLine()) != null) {
Log.d("MyActivity", "Line: " + line);
String[] tokens = line.split(",");
mGender=tokens[1];
mMeaning=tokens[2];
mName=tokens[3];
mOrigin=tokens[4];
BabyName babyName=new BabyName(mGender,mMeaning,mName,mOrigin);
babyName.setGender(mGender);
babyName.setName(mName);
babyName.setOrigin(mOrigin);
babyName.setMeaning(mMeaning);
database.babyDao().insert(babyName);
babyNames.add(babyName);
Log.d(TAG, "Just created: " + mGender+mMeaning+mName+mOrigin);
}
} catch (IOException e) {
Log.wtf("MyActivity", "Error reading data file on line" + line, e);
e.printStackTrace();
}
}
答案 0 :(得分:2)
我通过了GitHub项目链接,您的CSV文件中的条目超过了 22K 。 另一件事是您不从Room中读取数据,您刚刚插入了这些对象并使用ArrayList更新适配器。
首先,您应该不在主线程上执行此 CPU密集型操作,这是阻塞用户界面的时间很长。 [我的设备上刚刚测试过的代码]
使用辅助线程或任何其他线程机制(如 RxJava )执行此 CPU密集型操作。然后将结果返回到主线程并更新您的UI。
考虑到22K条目,您应该考虑使用Android体系结构库随附的分页
在另一个线程上执行private void readData()
操作,创建对象列表并一次插入数据库。使用下面的另一种dao方法
@Insert
void insertAll(List<BabyName> babyNames);
使用List<BabyName>
方法在Activity中观察database.babyDao().getAllData();
,在该观察者中,将BabyNames设置为adapter.setBabyNames(names)
的适配器并调用adapter.notifyDatasetChanged()
这是观察LiveData的方法-示例ProductFragment
// Observe product data
model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
@Override
public void onChanged(@Nullable ProductEntity productEntity) {
model.setProduct(productEntity);
// Update adapter data and notify dataset changed here
}
});
如果您要使用 Room 数据库,并且想遵循 Android体系结构指南,请使用MVVM体系结构。打开应用程序后,您将开始CSV处理任务,UI会使用LiveData
观察数据库的更改。因此,在完成csv处理并更新数据库后,您可以在用户界面中查看所有内容
有关分页支持,请参阅此文章-Android Pagination
编辑1
我已经在 GitHub 上创建了Pull Request,可以解决此问题。 现在,应用程序已按预期运行。
它解决了以下问题