2016-02-15 12 views
7

Tôi gặp vấn đề với việc hiểu thực tiễn tốt về việc đóng trường hợp Realm là gì, bất cứ khi nào tôi chạy giao dịch không đồng bộ. Trong ứng dụng của tôi, tôi có nhiều bộ điều khiển và tôi không chuyển vào trường hợp Realm từ hoạt động, thay vào đó tôi tạo một đối tượng mới mỗi khi cần thiết và đóng nó ngay khi hoàn thành công việc.Lĩnh vực - cách đóng trường hợp realm với giao dịch không đồng bộ

Tuy nhiên gần đây tôi phát hiện ra rằng nó không hoạt động chính xác, nếu tôi đóng trường hợp realm khi nó đang chạy giao dịch không đồng bộ.

Realm cacheRealm = RealmDelegate.getCacheRealm(); 

cacheRealm.executeTransaction(realm -> { 
    doSomeWork(response); 
    realm.copyToRealmOrUpdate(response); 
}, callback); 
cacheRealm.close(); 

Mã này trên có một vấn đề lớn, gọi lại mà không bao giờ được đưa ra, kể từ khi tôi đang đóng dụ lĩnh vực trước khi giao dịch kết thúc.

Vì vậy, tôi không chắc mình phải xử lý tình huống này như thế nào. Tôi có nghĩa vụ phải vượt qua ví dụ của đối tượng Realm vào mỗi bộ điều khiển từ hoạt động hoặc mảnh, và xử lý đóng cửa các trường hợp realm chỉ ở đó? Hoặc có thể có những giải pháp thanh lịch hơn cho vấn đề này?

Ngoài ra một điều khác mà tôi tự hỏi là những gì sẽ xảy ra, nếu tôi sẽ không đóng Realm db, và có cách nào để kiểm tra xem tất cả các trường hợp của Realm đã bị đóng chưa?

Trả lời

4

Bạn có thể đóng Realm trong cuộc gọi lại? Bạn có cả lỗi gọi lại thành công và lỗi để móc vào: https://realm.io/docs/java/latest/#asynchronous-transactions

realm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm bgRealm) { 
      User user = bgRealm.createObject(User.class); 
      user.setName("John"); 
      user.setEmail("[email protected]"); 
     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      // Transaction was a success. 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      // Transaction failed and was automatically canceled. 
     } 
    }); 
+0

Điều này có vấn đề nhỏ, vì tôi sẽ tạo ra gọi lại trong lớp khác, do đó tôi cần tạo trường hợp Realm ở đó. Nhưng tôi đoán nó tốt hơn là có một ví dụ trong Hoạt động hoặc Phân đoạn. Đối với phần thứ hai của câu hỏi, có cách nào để kiểm tra xem tất cả các trường hợp đã bị đóng chưa? –

+0

Không, bạn có thể sử dụng 'Realm.isClosed' nhưng điều đó sẽ chỉ kiểm tra cá thể trên chuỗi hiện tại. –

+0

Bạn có thể tạo một cuộc gọi lại khác và có thể gọi lại cuộc gọi ban đầu được chuyển từ các lớp khác trong phần gọi lại đã tạo. – zaki50

Các vấn đề liên quan