【问题标题】:Sync Adapter called twice using ContentObserver使用 ContentObserver 调用了两次同步适配器
【发布时间】:2016-05-02 20:55:14
【问题描述】:

所以我一直遇到这个问题,当我明确调用 requestSync 时首先调用 onPerformSync,然后在 30 或 60 秒后(但主要是 60 秒),这很奇怪。我正在使用 ContentObserver,并且这种行为仅在我使用 ContentObserver 时才会发生。我尝试直接从我的内容提供商调用 requestSync 并且没有触发额外的 onPerformSync。下面列出了我的代码摘录。

提供者调用 notifyChange

@Nullable
@Override
public Uri insert(@NonNull Uri uri, ContentValues values) {
    Log.d(LOG_TAG, "Inserting with uri " + uri + " with values " + values.toString());
    SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    int match = sUriMatcher.match(uri);

    ....

    // This direct requestSync call does not trigger extra syncs
    //Bundle extras = new Bundle();
    //extras.putString(SyncAdapter.CHANGED_URI, uri.toString());
    //getContext().getContentResolver().requestSync(SyncAccount.getAccount(), Contract.CONTENT_AUTHORITY, extras);

    getContext().getContentResolver().notifyChange(contentUri, null);

    return contentUri;
}

带有 onChange 的 ContentObserver

public class TableObserver extends ContentObserver {

    private final static String LOG_TAG = TableObserver.class.getSimpleName();

    private final Account mAccount;

    public TableObserver(Handler handler, Account account) {
        super(handler);

        mAccount = account;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange, null);
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        Log.d(LOG_TAG, "Provider changed here: " + uri.toString());
        Bundle args = new Bundle();
        args.putString(SyncAdapter.CHANGED_URI, uri.toString());

       ContentResolver.requestSync(mAccount,  Contract.CONTENT_AUTHORITY, args);
    }
}

使用 onPerformSync 同步适配器

public class SyncAdapter extends AbstractThreadedSyncAdapter {

    private static final String LOG_TAG = SyncAdapter.class.getSimpleName();

    public static final String CHANGED_URI = "changed_uri";

    private ContentResolver mContentResolver;

    public SyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);

        mContentResolver = context.getContentResolver();
    }

    public SyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
        super(context, autoInitialize, allowParallelSyncs);

        mContentResolver = context.getContentResolver();
    }

    // This is automatically performed in a background thread.
    @Override
    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
        Log.d(LOG_TAG, "Synchronizing: " + extras.get(CHANGED_URI));
    }
}

【问题讨论】:

    标签: java android asynchronous android-syncadapter contentobserver


    【解决方案1】:

    通过将 false 传递给 notifyChange 来修复它,它确实删除了该方法的与网络行为的同步,如下所示:

    getContext().getContentResolver().notifyChange(contentUri, null, false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多