Как показать сообщение об ошибке синхронизации

Я создал адаптер синхронизации контактов. Все работает нормально, но мне нужно еще кое-что. Если по какой-то причине синхронизация не завершается успешно, я хочу показать сообщение, подобное тому, которое показывает учетная запись Google, когда синхронизация не удалась.

Скриншот


person nikmin    schedule 12.02.2013    source источник
comment
Итак, вы спрашиваете, как показать это сообщение или какие исключения нужно перехватить, чтобы узнать, что синхронизация не удалась?   -  person Martin Grohmann    schedule 12.02.2013
comment
У меня есть catch блоки в onPerformSync, которые перехватывают исключения, и в этих блоках у меня есть syncResult.stats.numParseExceptions++ и syncResult.stats.numIoExceptions++. Я надеюсь, что это правильный способ поймать исключения. Если это так, мне нужно, как показать сообщение   -  person nikmin    schedule 12.02.2013


Ответы (2)


Решение состояло в том, чтобы установить задержку результата синхронизации. После этой задержки синхронизация будет перезапущена.

try {
    DO THE SYNCHRONIZATION
} catch (AuthenticationException e) {
    Log.e(TAG, "AuthenticationException");
    syncResult.stats.numAuthExceptions++;
    syncResult.delayUntil = 180;
} catch (ParseException e) {
    Log.e(TAG, "ParseException");
    syncResult.stats.numParseExceptions++;
} catch (IOException e) {
    Log.e(TAG, "IOException");
    syncResult.stats.numIoExceptions++;
    syncResult.delayUntil = 180;
}
person nikmin    schedule 12.02.2013
comment
Он покажет сообщение в нижней части экрана, подобное изображенному на картинке, и повторит попытку синхронизации через количество секунд, указанное с помощью syncResult.delayUntil = numOfSeconds;. - person nikmin; 12.02.2013

Я думаю, вам нужны тосты

Простой тост:

Toast.makeText(context, text, duration).show();

text — это, как вы понимаете, текст, который вы хотите отобразить. duration — это Toast.LENGTH_SHORT или Toast.LENGTH_LONG (зависит от того, как долго Toast будет виден)

Более сложный подход с изображением в тосте: (sync_toast_lo.xml)

<?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/SynctoastLayout"
    android:background="@android:color/black">

  <ImageView
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:src="@drawable/your_logo"
    android:layout_toLeftOf="@+id/textView"
    android:layout_margin="5dip"
    android:id="@+id/syncLogo">
  </ImageView>

  <TextView
    android:id="@+id/syncFailedText"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:text="The sync has failed!"
    android:gravity="center"
    android:textColor="@android:color/white">
  </TextView>
</RelativeLayout>

И в вашем коде:

LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.Sync_toast_lo,
                               (ViewGroup) findViewById(R.id.SynctoastLayout));

Toast toast = new Toast(this);
toast.setView(view);
toast.show();
person Martin Grohmann    schedule 12.02.2013
comment
НЕТ, я не хочу тост. Я очень хорошо знаю, что такое тост. Я хочу показывать сообщение в учетных записях и синхронизировать точно так же, как учетная запись Google показывает сообщение при сбое синхронизации - person nikmin; 12.02.2013
comment
не должен был быть отклонен... Единственная проблема с тостом заключается в том, что он находится в классе бездействия в SyncAdapter.java - person Brandon; 18.02.2015
comment
+ синхронизация выполняется в фоновом режиме и отображение всплывающего уведомления от bg не работает. - person User; 09.05.2017