我应该在onSaveInstanceState中持久保存数据对象

时间:2016-10-28 18:55:52

标签: android state greendao screen-rotation

我在我的Android应用中使用greenDAO来显示RecyclerView中的对象列表。我有一个RecyclerView.Adapter的子类,它接受一个greenDAO实体的对象列表。

我在onCreate所做的是:

  1. 创建我的适配器的实例,为我的列表传递null。这只是为了让适配器为RecyclerView所知。
  2. 使用布局和适配器初始化RecyclerView
  3. 调用一个使用greenDAO异步查询数据的方法,并在成功时使用实际的对象列表更新适配器,以便显示它们。
  4. 这是相关代码:

    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?

1 个答案:

答案 0 :(得分:2)

您正在做的事情是完全有效的,您不需要在onSaveInstanceState()中保存查询数据,使用内存缓存或任何其他优化(即使GreenDAO没有内部缓存)

事实上,你不仅仅是因为你异步执行查询 - GreenDAO的创建者声称在大多数情况下可以在UI线程上执行查询(我很难同意)。

我还建议您在onStart()而不是onCreate()中执行数据查询。我个人认为onCreate()应仅用于您在构造函数中执行的操作(例如字段初始化)。在onStart()中执行此查询的另一个原因是,如果用户长时间离开您的应用程序然后返回该应用程序,则数据可能会过时(例如,由于SyncAdapter的后台同步)和你会想要刷新它。

您可能想要添加的最后一部分是“数据更改通知”。如果您查询并显示给用户的数据可以在没有用户交互的情况下更改(例如,由于SyncAdapter的后台同步),您将需要此机制。概念很简单 - ActivityonCreate()中注册有关数据更改的通知,如果收到通知,则执行重新查询以确保用户看到最新数据。< / p>

我不能说上述是“最佳做法”,但它们是良好的做法,效果很好。

懒惰列表:

正如@pskink在评论中建议的那样,您也可以使用LazyList。但请注意,它不会消除对异步数据查询的需要。使用LazyList可以像往常一样执行查询,但可以按需方式将结果加载到内存中。如果您希望查询生成大量数据,这可能很有用。

但是,在我看来,只有在观察到实际性能问题时才应优化代码。因此,除非您提前知道特定查询会产生数千个结果,否则我说您不需要LazyList