Тайм-аут Firestore для Android - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время я создаю приложение, которое сохраняет запись в блоге пользователя на сервере Firestore.Все работает нормально, но я обнаружил, что сообщение не было загружено при нестабильном подключении к Интернету.

Я попытался установить время ожидания для Firestore экземпляра , но похоже, что для библиотеки Firestore нет параметра времени ожидания.Проблема в том, что из-за отсутствия настройки времени ожидания приложение не знает, когда закрыть экран загрузки (диалоговое окно Spinner).

Я думал о создании Handler или Observable или Thread и установке времени ожидания вручную.По истечении указанного периода времени, приложение должно закрыть экран загрузки.Однако клиент Firestore будет продолжать повторную загрузку в фоновом режиме даже после истечения времени ожидания.Таким образом, этот подход не подходит для этого случая ...

Есть ли какое-то решение для этого? Если я могу установить тайм-аут для самого клиента Firestore, то есть позволить клиентупозвоните onFailure() по истечении заданного времени ожидания, я могу просто сохранить сообщение как черновик в локальном хранилище и повторить попытку, когда устройство вернется к стабильному соединению.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Firestore немедленно добавит документ в локальный кеш.Затем он попытается синхронизировать этот документ с сервером.Чтобы определить, сможет ли он это сделать, взгляните на ответ Гастона.

Чтобы определить , когда документ был записан на сервер, используйте SuccessListener.Этот пример из документации Firestore о добавлении документов показывает, как:

// Add a new document with a generated id.
Map<String, Object> data = new HashMap<>();
data.put("name", "Tokyo");
data.put("country", "Japan");

db.collection("cities")
        .add(data)
        .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
            @Override
            public void onSuccess(DocumentReference documentReference) {
                Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId());
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "Error adding document", e);
            }
        });
0 голосов
/ 30 мая 2018

Лучший способ сделать это - подключить логическое значение, которое сообщит вам, если у вас есть интернет, прежде чем что-то делать (это просто для того, чтобы отключить ваш счетчик, поскольку у firestore есть автономные функции, такие как firebase)

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

поэтому вы должны сначала проверить, если у вас есть активное соединение, этот метод будет пинговать google.com и проверить подключение к интернету, если через 1,5 секунды он не будет доступен, он вернет false

, поэтому вы должны сделать что-то вроде этого(псевдокод)

if(hasActiveInternetConnection)
doyourfirebaseuploadstuff
else
spinner.dismiss()
Toast(please check your internet connection and try again)

Не забудьте добавить свои интернет-разрешения в манифест

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

РЕДАКТИРОВАТЬ:

Еще один крутой метод, возможно, более читабельный для кого-то, может быть такимодин

public boolean isInternetWorking() {
    boolean success = false;
    try {
        URL url = new URL("https://google.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setConnectTimeout(10000);
        connection.connect();
        success = connection.getResponseCode() == 200;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return success;
}

он просто работает как другой, вместо этого он просто будет ждать 10 секунд, пока не вернется интернет-статус

счастливое кодирование!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...