2017-07-21 18 views
5

Tôi đang cố gắng cập nhật các trường hợp của một số chủ đề. Thay vì giải thích mọi thứ tôi đã tạo một sơ đồ khi tôi hiểu nó.Làm thế nào để cập nhật Realm trong một số chủ đề trong Android?

Ở đây là: enter image description here

Vì vậy, vấn đề là khi tôi gọi notifyAppWidgetViewDataChanged() nó không cập nhật các lĩnh vực. Tôi đã thử thêm Realm.OnChangeListener vào Dịch vụ onCreate(), nhưng phương pháp này không được gọi khi thay đổi lĩnh vực từ chuỗi chính. Tôi cũng đã thử gọi số getDefaultRealmInstance() từ dịch vụ onGetViewFactory() để thay thế. Cùng một vấn đề.

+1

Hey Vlad. Trong khi tôi không có nghi ngờ rằng hình ảnh thường có giá trị 1K từ, trong bối cảnh cụ thể này, tôi muốn có mã ;-). Vì vậy, nhiều phụ thuộc vào chi tiết cụ thể và chính xác những gì thực hiện của bạn trông như thế nào. Nói chung, Loopers (chủ đề) nên thông báo thay đổi bất cứ lúc nào họ đang nhàn rỗi. –

+0

Xin chào G. Blake Meike và cảm ơn bạn đã phản hồi. Tôi đã khắc phục vấn đề theo cách khá lame. Tôi đã mở và đóng cõi trong hầu hết mọi phương pháp trong nhà máy, vì nó bật ra các phương pháp của nhà máy chạy trên các chủ đề khác nhau. (Ví dụ 'onCreate' chạy trên luồng UI và' notifyDataChanged' chạy trên một luồng khác). Nó hoạt động ngay bây giờ, đó là điều quan trọng. –

+1

Thật tuyệt vời @vlad. Nếu bạn có một vài phút, Nó sẽ là tuyệt vời nếu bạn sẽ làm một cách nhanh chóng ghi giải pháp của bạn, vì vậy cộng đồng có thể nhìn thấy nó. Tôi sẽ upvote nó! ;-P –

Trả lời

0

Allright, đây là tôi "không-để-nhớ-hiệu quả" giải pháp:
Từ dịch vụ của Widget tôi ghi đè phương pháp duy nhất để tạo ra nhà máy dụ:

@Override 
public RemoteViewsFactory onGetViewFactory(Intent intent) { 
    return new WidFactory(getApplicationContext()); 
} 

Và sau đó WidFactory lớp:

class WidFactory implements WidService.RemoteViewsFactory { 
    private static int myTasksSize; 
    private Context context; 
    private Realm realm; 
    private RealmResults<Task> myTasks; 
    WidFactory(Context context){ 
     this.context = context; 
    } 
    @Override 
    public void onCreate() { 
     realm = Realm.getDefaultInstance(); 
     myTasks = realm.where(Task.class).findAll(); 
     myTasksSize = myTasks.size(); 
     realm.close(); 
    } 
    @Override 
    public void onDataSetChanged() { 
     realm = Realm.getDefaultInstance(); 
     realm.refresh(); 
     myTasks = realm.where(Task.class).findAll(); 
     myTasksSize = myTasks.size(); 
     realm.close(); 
    } 

    @Override 
    public RemoteViews getViewAt(int position) { 
     realm = Realm.getDefaultInstance(); 
     myTasks = realm.where(Task.class).findAll(); 
     RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widgetrow_layout); 
     final Task myTask = myTasks.get(position); 
     rv.setTextViewText(R.id.widgetrow_text_id, myTask.getTaskText()); 
     Intent fillInIntent = new Intent(context, WidShowTaskActivity.class); 
     fillInIntent.putExtra("code", myTask.getCode()); 
     realm.close(); 
     rv.setOnClickFillInIntent(R.id.widgetrow_text_id, fillInIntent); 
     return rv; 
    } 

    @Override 
    public int getCount() { 
     return myTasksSize; 
    } 
    @Override 
    public RemoteViews getLoadingView() { 
     return null; 
    } 
    @Override 
    public int getViewTypeCount() { 
     return 1; 
    } 
    @Override 
    public long getItemId(int position) { 
     return position; 
    } 
    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 
    @Override 
    public void onDestroy() { 
     if (!realm.isClosed()){  realm.close();  } 
    } 
} 

Điều xấu với giải pháp này là tôi mở và đóng vương quốc 3 lần: trong onCreate(), onDatasetChanged() và trong getViewAt(). Điều thậm chí còn tệ hơn là nói chung tôi chỉ cần một thể hiện lĩnh vực cho tất cả các vật dụng, vì vậy tôi muốn vượt qua lĩnh vực trong các nhà máy xây dựng, vì vậy tất cả các nhà máy sử dụng một lĩnh vực. Nhưng 2 vấn đề xuất hiện:
1) tôi không biết làm thế nào để "cập nhật" trường hợp lĩnh vực khi bắt đầu từ dịch vụ; Android không cung cấp bất kỳ phương pháp nào.
2) Tôi không chắc các nhà cung cấp nội dung hoạt động như thế nào, nhưng lớp nhà máy bằng cách nào đó đã lan truyền công việc qua một số luồng và Realm không thích điều này. Không có gì.
P.S. Hãy sửa tôi nếu tôi sai ở đâu đó tôi tương đối mới với Android và Realm.
Và cảm ơn bạn đã trả lời :) @G. Blake Meike

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