Бесконечный цикл SyncAdapter - PullRequest
0 голосов
/ 18 марта 2019

Вчера я тестировал свое приложение на некоторых виртуальных устройствах в Genymotion и несколько раз осознавал, что приложение отправляет бесконечные запросы синхронизации на сервер на некоторых устройствах (все они были API <21).В чем проблема? </p>

Давайте приведем некоторую информацию о проекте: я использовал SyncAdapter и Room Persistence в своем проекте.Когда я читаю документы на Android, я должен использовать ContentProvider для доступа к базе данных из SyncAdapter.Но я оставил ContentProvider пустым и подключился к Room напрямую из SyncAdapter.Вот некоторые из кодов проекта, которые могут помочь вам представить операции:

Класс SyncAdapter:

public class SyncAdapter extends AbstractThreadedSyncAdapter {
  public SyncAdapter(Context context, boolean autoInitialize) {
    super(context, autoInitialize);
  }
  public SyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
    super(context, autoInitialize, allowParallelSyncs);
  }
  @Override public void onPerformSync(Account account, Bundle extras, String authority,
      ContentProviderClient provider, SyncResult syncResult) {
    if (!AppCheckUtils.appInForeground(getContext())) {
      SyncDataWithServer.sendRequest(getContext());
    }
  }
}

Класс ContentProvider:

public class DataContentProvider extends ContentProvider {
  @Override public boolean onCreate() {
    return true;
  }

  @Nullable @Override
  public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
      @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    return null;
  }
  @Nullable @Override public String getType(@NonNull Uri uri) {
    return null;
  }
  @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
    return null;
  }
  @Override public int delete(@NonNull Uri uri, @Nullable String selection,
      @Nullable String[] selectionArgs) {
    return 0;
  }
  @Override
  public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
      @Nullable String[] selectionArgs) {
    return 0;
  }
}

AndroidManifest.xml:

...
    <provider
        android:name=".contentProvider.DataContentProvider"
        android:authorities="@string/syncContentProvider"
        android:exported="false"
        android:syncable="true"/>
...

SyncAdapter.xml:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="@string/console_account"
    android:allowParallelSyncs="false"
    android:contentAuthority="@string/syncContentProvider"
    android:isAlwaysSyncable="true"
    android:supportsUploading="false"
    android:userVisible="false"/>

SyncDataWithServer class:

public class SyncDataWithServer {
  private static RESTConnector<SyncResult> messagesREST;
  private static final Object lockObject = new Object();
  public static void sendRequest(Context context) {
    synchronized (lockObject) {
      if (messagesREST == null)
        messagesREST =
            new RESTConnector<>(SendTokenCondition.USERTOKEN__TEMPCODE, false, (ToastErrMsg) null,
                true, 0);
    }
    if (BasicAuth.hasTokenOrTempCode()) {
      if (SerCons.BASE_ST.contains("twitch.tv")) {
        return;
      }
      SettingDataDaoHnd
          .getSyncSettings(context, syncSettings -> sendRequest(context, syncSettings));
    }
  }
  private static void sendRequest(Context context, SyncSettingsFromDB syncSettings) {
    ...
  }
}

1 Ответ

0 голосов
/ 22 марта 2019

Я нашел проблему.Когда я вызываю accountManager.addAccount (..) или accountManager.removeAccount (..) или accountManager.setPassword, он вызывает метод syncAdapter.onPerformSync (..), а затем отправляет запрос серверу, ....Это вызывает бесконечность петли.Я решил проблему с добавлением дополнений в Bundle при вызове ContentResolver

Bundle bundle = new Bundle();
bundle.putBoolean(IntentCons.SYNC_ADAPTER_DO_SYNC, true);
ContentResolver.addPeriodicSync(account, authority, bundle, syncPeriod);

, затем в onPerformSync:

  @Override public void onPerformSync(Account account, Bundle extras, String authority,
      ContentProviderClient provider, SyncResult syncResult) {
    boolean doSync = extras.containsKey(IntentCons.SYNC_ADAPTER_DO_SYNC) && extras.getBoolean(IntentCons.SYNC_ADAPTER_DO_SYNC);
    if (doSync) {
      SyncDataWithServer.sendRequest(getContext());
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...