例如,如果我有这些代码:
Realm realm = Realm.getDefaultInstance();realm.beginTransaction();mUser.setname("Roy");realm.commitTransaction();textVIEw1.setText(mUser.getname());
根据该文档,它表示如果事务内部存在错误,将捕获异常并且不会保留数据.所以在上面的代码中,假设mUser.setname中有错误(“Roy”);或者realm.commitTransaction();,不会出现崩溃,代码仍会继续?但是,在这种情况下不会调用cancelTransaction.会发生什么?更新:看起来应用程序不会崩溃,但下次如果你继续从Realm读取内容它会崩溃并告诉你Realm被锁定,因为没有调用commitTransaction.
我只是不知道如果存在可能发生错误的风险,您将使用beginTransaction和commitTransaction的可能性.有alreaday executeTransaction和executeTransactionAsync可以很好地处理它.特别是对于executeTransactionAsync,我猜大多数人都会使用executeTransactionAsync,因为它有onSuccess和onError.
对我来说,我只能想到一个原因:我想做一个简单的数据更新,仍然使用相同的线程.在这种情况下,我将使用:
try { realm.executeTransaction(new Realm.Transaction() { @OverrIDe public voID execute(Realm realm) { mUser.setname("Roy"); } });} catch (Exception e) { Logger.e(TAG, "error", e); Toast.makeText(getActivity(), R.string.error_occurred, Toast.LENGTH_SHORT).show(); return;}
解决方法:
realm.executeTransaction(new Realm.Transaction() { @OverrIDe public voID execute(Realm realm) { //... }});
相当于
realm.beginTransaction();try { //... realm.commitTransaction();} catch(Throwable e) { if(realm.isInTransaction()) { realm.cancelTransaction(); } throw e;}
所以如果你问我,begin / commit容易出错,如果没有catch {cancel ..}子句你就不应该使用它.
至于在失败的情况下不调用cancelTransaction(),我刚刚结束了一旦我开始调用cancelTransaction()就停止发生的神秘问题,但那是一段时间之前.
总结以上是内存溢出为你收集整理的android – 为什么/何时使用realm.beginTransaction?由于有executeTransaction和executeTransactionAsync全部内容,希望文章能够帮你解决android – 为什么/何时使用realm.beginTransaction?由于有executeTransaction和executeTransactionAsync所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)