我在我的Android应用中使用greenDAO来显示RecyclerView
中的对象列表。我有一个RecyclerView.Adapter
的子类,它接受一个greenDAO实体的对象列表。
我在onCreate
所做的是:
null
。这只是为了让适配器为RecyclerView
所知。RecyclerView
。这是相关代码:
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?
答案 0 :(得分:2)
您正在做的事情是完全有效的,您不需要在onSaveInstanceState()
中保存查询数据,使用内存缓存或任何其他优化(即使GreenDAO没有内部缓存)
事实上,你不仅仅是因为你异步执行查询 - GreenDAO的创建者声称在大多数情况下可以在UI线程上执行查询(我很难同意)。
我还建议您在onStart()
而不是onCreate()
中执行数据查询。我个人认为onCreate()
应仅用于您在构造函数中执行的操作(例如字段初始化)。在onStart()
中执行此查询的另一个原因是,如果用户长时间离开您的应用程序然后返回该应用程序,则数据可能会过时(例如,由于SyncAdapter
的后台同步)和你会想要刷新它。
您可能想要添加的最后一部分是“数据更改通知”。如果您查询并显示给用户的数据可以在没有用户交互的情况下更改(例如,由于SyncAdapter
的后台同步),您将需要此机制。概念很简单 - Activity
在onCreate()
中注册有关数据更改的通知,如果收到通知,则执行重新查询以确保用户看到最新数据。< / p>
我不能说上述是“最佳做法”,但它们是良好的做法,效果很好。
懒惰列表:
正如@pskink在评论中建议的那样,您也可以使用LazyList
。但请注意,它不会消除对异步数据查询的需要。使用LazyList
可以像往常一样执行查询,但可以按需方式将结果加载到内存中。如果您希望查询生成大量数据,这可能很有用。
但是,在我看来,只有在观察到实际性能问题时才应优化代码。因此,除非您提前知道特定查询会产生数千个结果,否则我说您不需要LazyList
。