1

SyncAdapter를 사용하여 데이터를 서버와 동기화합니다. 모든 것이 작동하지만, SyncAdapter에 추가 비용을 보내고 있습니다. 내가 SyncAdapter에 요청을 보내려면 다음 코드를 사용하여 내 ContentObserver에서ContentResolver.requestSync <= 추가 기능 보내기 => SyncAdapter.onPerformSync

:

@Override 
public void onChange(boolean selfChange, Uri changeUri) { 

    Bundle extras = new Bundle(); 
    extras.putParcelable(Globals.EXTRA_URI, changeUri); 
    extras.putInt("no", 123456); 
    extras.putBoolean(
      ContentResolver.SYNC_EXTRAS_MANUAL, true); 
    extras.putBoolean(
      ContentResolver.SYNC_EXTRAS_EXPEDITED, true); 
    ContentResolver.requestSync(account, MyProvider.AUTHORITY, extras); 

} 

을하지만, SyncAdapter 측면에서, 나는이 엑스트라를하지 않습니다

@Override 
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { 

    Uri changeUri = extras.getParcelable(Globals.EXTRA_URI); 
    int aaa = extras.getInt("no"); 

    Log.i(TAG, "Syncadapter/uri: "+changeUri+"/"+aaa+"/"+extras.size()); 

//Logcat: Syncadapter/uri: null/0/1 

... 
} 

내가 좋아하는 것 엑스트라를 사용하여 어떤 데이터를 동기화해야하는지 확인하십시오. 또한 시스템은 ContentResolver 특정 추가 기능을 무시합니다. ContentResolver.SYNC_EXTRAS_MANUAL (동기화가 즉시 수행되지 않음)


편집 : 난 그냥 눈치 , ContentObserver.onChange에 의해 호출 경우에만 그 여분의 PARAMS를 잃어버린 있다고(). 내 액티비티에 requestSync()로 전화하면 모든 것이 알려지며 작동합니다.

답변

2

나는 그 진짜 이유를 모른다. 그러나 나는 그것을 작동시킬 수 있었다.

문제는 내가 URI를 분해 할 수있는 여분으로 보내려고한다는 것이 었습니다. ContentObserver를 통해 전송할 때 자동으로 SyncAdapter로 보내지 못했습니다. 하지만 내 활동에서 동일한 호출을 시도했을 때 예외가 발생했습니다 (실제 내용을 기억하지 못함).

해결책은이 여분을 없애고 대신 일정한 정수를 보내는 것입니다.