【发布时间】:2016-10-28 18:55:52
【问题描述】:
我在我的安卓应用程序中使用greenDAO 来显示RecyclerView 中的对象列表。我有一个 RecyclerView.Adapter 的子类,它接受一个作为 greenDAO 实体的对象列表。
我在onCreate做的是:
- 为我的列表创建一个传递
null的适配器实例。这只是为了让下面的RecyclerView知道适配器。 - 使用布局和适配器初始化
RecyclerView。 - 调用一个使用 greenDAO 异步查询数据的方法,并在成功后使用实际的对象列表更新适配器,以便显示它们。
这是相关代码:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mListAdapter = new MyRecyclerAdapter(null);
mList.setHasFixedSize(true);
mList.setLayoutManager(mLayoutManager);
mList.setAdapter(mListAdapter);
refreshItems();
}
public void refreshItems()
{
AsyncSession asyncSession = ((App)getApplication()).getDaoSession().startAsyncSession();
asyncSession.setListenerMainThread(new AsyncOperationListener()
{
@Override
public void onAsyncOperationCompleted(final AsyncOperation operation)
{
if (operation.isCompletedSucessfully())
mListAdapter.setItems((List<Item>) operation.getResult());
}
});
asyncSession.loadAll(Item.class);
}
这很好用。现在我注意到,当然,每次我旋转活动或从另一个活动返回到它时,都会调用通过 greenDAO 查询数据库的方法。这很清楚,因为我是从onCreate 调用该方法的。
我的问题是:最好的做法是像我这样做(每次都重新查询 DAO)还是让我的对象可打包并将我在onSaveInstanceState 中的列表保存在onRestore 中而不是重新查询 DAO?
【问题讨论】:
-
可能两者都不是。使用某种内存缓存。我没用过greenDAO,但是如果没有内置的,就创建一个。实例状态用于识别信息(不是
Intent的一部分)和临时信息(例如,您不想提交到持久存储的部分完成的表单)。 -
@CommonsWare 好吧,他们的文档说的是查询和会话:
A side effect of this is some kind of entity “caching”. If an entity object is still around in memory (greenDAO uses weak references here), the entity is not constructed again. Also, greenDAO performs no database query to update the entity values. Instead, the object is returned “immediately” from the session cache,所以似乎已经有了某种缓存。 -
“最佳实践”值得商榷,但我支持@CommonsWare 评论。 savedInstanceState 用于特定
instance的state,它可能是一些表单数据或一些状态机。数据库结果不属于该状态,不应保存在那里。我也从未使用过 greenDao,但如果它不缓存,您可以使用 LruCache 或 WeakReference。 编辑:我看到了你的评论,所以如果 greenDao 已经缓存了,就让你的代码保持原样 -
感谢您的两位 cmets。我想我会暂时保留它们,然后再检查大量数据(这不会发生在我的应用程序中),看看性能影响是什么。
-
btw 在第 3 步中,您正在加载所有项目(因此您需要异步),为什么不使用
listLazy?
标签: android state greendao screen-rotation