7

Tôi biết bạn bị cám dỗ để đánh dấu bản sao này nhưng chờ, hãy xem lại lần nữa với các nỗ lực chi tiết (nhưng không thành công) của tôi.Phương thức onChange của Observer bị bắn nhiều lần

Chiến lược 1: Thuật toán:Answer

  1. Lần đầu tiên các onChange là bắn, lấy id của hàng cập nhật

  2. Lần sau các onChange là bắn một lần nữa có được id của hàng được cập nhật

  3. Phù hợp với id

  4. Bỏ qua nếu cùng id Vấn đề

với cách tiếp cận này là nó là dễ bị tổn thương để đua điều kiện. Nếu theo thời gian bạn nhận được id của hàng được cập nhật, onChange đã kích hoạt lần thứ hai, thuật toán này sẽ không thành công. Điều này có nguồn gốc từ kinh nghiệm cá nhân của tôi trong khi thử nghiệm trên máy chậm hoặc máy hoạt động ở công suất tối đa.

Chiến lược 2: Thuật toán:Answer

deliverSelfNotifications Override() để trở thành sự thật.

Điều này có vẻ đầy hứa hẹn lúc đầu nhưng không hoạt động. Code tôi sử dụng để tham khảo:

Trong Hoạt động chính: OnCreate Phương pháp tôi đăng ký:

getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CtObserver(new Handler())); 

Sau đó, trong một lớp riêng biệt:

package com.example.testproject; 

import android.database.ContentObserver; 
import android.os.Handler; 
import android.util.Log; 

/** 
* @author Time Traveller 
*/ 

public class CtObserver extends ContentObserver { 

public CtObserver(Handler handler) { 
    super(handler); 
} 

public boolean deliverSelfNotifications(){ 
    return true; 
} 

@Override 
public void onChange(boolean selfChange) { 
    super.onChange(selfChange); 
    Log.e("onChange","Fired"); 
} 
} 

Tại sao bạn nên đóng góp cho câu trả lời này:
Nhà cung cấp nội dung SMS Quering là cách duy nhất cho Ứng dụng không mặc định là chụp sự kiện cho Đã gửi SMS. Nhưng cho đến bây giờ tôi vẫn chưa tìm thấy bất kỳ câu trả lời đầy đủ chức năng thuyết phục nào cho phương pháp này. Vì vậy, chúng tôi thực sự cần phải có một số suy nghĩ về điều này !!

Câu hỏi:

  1. các chức năng (không tinh chỉnh) cách đơn giản là khi biết rằng một tin nhắn SMS được viết để các nhà cung cấp nội dung chỉ một lần là bao nhiêu?
  2. Cách chính xác khi sử dụng deliverSelfNotifications() trong Lớp quan sát nội dung là gì?

Bạn không cần trả lời tất cả câu hỏi, chỉ cần cho chúng tôi biết bất kỳ điều gì bạn biết.

Trả lời

1

deliverSelfNotifications() có thể được thiết kế để tách riêng thay đổi dữ liệu khỏi thay đổi bản trình bày. Ví dụ: nội dung có thể được sắp xếp trong ứng dụng của bạn nhưng không cần ứng dụng bên ngoài lấy lại dữ liệu chỉ vì nó đã được sắp xếp, vì hầu hết thời gian này sẽ không liên quan (ứng dụng đó có thể sử dụng bản trình bày khác nhau). Nói cách khác - phương pháp này kiểm soát nếu bạn muốn nhận các thay đổi được thực hiện cho nội dung bởi chính nhà cung cấp có thể hoặc không thực sự phản ánh các thay đổi dữ liệu có ý nghĩa với các cách ứng dụng của bạn.

Để sử dụng, bạn cần triển khai ContentObservable sử dụng thông báo tự thay đổi.

Đối với một câu hỏi khác, tôi muốn đề xuất HashSet để lưu trữ id thư. Với nó, bạn có thể so sánh id của thư với tất cả các thư đã xử lý bao giờ, không chỉ là thư cuối cùng, do đó loại bỏ sự cố bạn đã nêu.

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