ReactiveNetwork
ReactiveNetwork — это библиотека OHOS, которая отслеживает состояние сетевого подключения и подключение к интернету с помощью RxJava Observables. Она написана с использованием подхода реактивного программирования.
Возможности ReactiveNetwork:
Инструкции по использованию
Для примера приложения требуются следующие разрешения:
ohos.permission.INTERNET
ohos.permission.GET_NETWORK_INFO
По умолчанию поддержка открытого текста в HTTP отключена. Однако HTTPS поддерживается по умолчанию. Чтобы поддерживать HTTP, необходимо добавить «network» в файл config.json и установить атрибут «cleartextTraffic» в значение true.
{
"deviceConfig": {
"default": {
"network": {
"cleartextTraffic": true
}
}
}
}
Отслеживание подключения к сети
Мы можем отслеживать Connectivity с помощью метода observeNetworkConnectivity(context) следующим образом:
ReactiveNetwork
.observeNetworkConnectivity(context)
.subscribeOn(Schedulers.io())
... // что-либо ещё, что можно сделать с RxJava
.observeOn(HarmonySchedulers.mainThread())
.subscribe(connectivity -> {
// делаем что-то с подключением
// можно вызвать connectivity.getNetworkState();
// или connectivity.getNetworkCapabilities();
},
throwable -> { /* обрабатываем ошибку здесь */} );
Когда Connectivity изменяется, подписчик будет уведомлён. Connectivity может изменить своё состояние или тип.
Ошибки обрабатываются так же, как и во всех наблюдаемых объектах RxJava. Например:
ReactiveNetwork
.observeNetworkConnectivity(context)
.subscribeOn(Schedulers.io())
.observeOn(HarmonySchedulers.mainThread())
.subscribe(
connectivity -> /* обрабатываем подключение здесь */,
throwable -> /* обрабатываем ошибку здесь */
);
Наблюдение за подключением к интернету
Непрерывное наблюдение за подключением к интернету
Мы можем непрерывно отслеживать подключение к интернету следующим образом:
ReactiveNetwork
.observeInternetConnectivity()
.subscribeOn(Schedulers.io())
.observeOn(HarmonySchedulizers.mainThread())
.subscribe(isConnectedToInternet -> {
// делаем что-то со значением isConnectedToInternet
},
throwable -> { /* обрабатываем ошибку здесь */} ););
Observable вернёт true подписке (disposable), если устройство подключено к интернету, и false, если нет.
Подключение к интернету будет проверяться как можно скорее.
Обратите внимание: этот метод менее эффективен, чем метод observeNetworkConnectivity(context), потому что в стратегии наблюдения по умолчанию он открывает соединение сокета с удаленным хостом каждые две секунды с двухсекундным таймаутом и использует передачу данных. Используйте этот метод, если он вам действительно нужен. При желании вы можете отказаться от подписки (disposable) сразу после получения уведомления о том, что интернет доступен, и выполнить работу, которую вы хотите, чтобы уменьшить количество сетевых вызовов.
Методы в этом разделе следует использовать, только если они действительно необходимы для конкретных случаев использования.
Если вы хотите настроить наблюдение за подключением к интернету, вы можете использовать класс InternetObservingSettings и его конструктор. Они позволяют настроить интервал мониторинга в миллисекундах, хост, порт, тайм-аут, начальный интервал мониторинга, тайм-аут, ожидаемый код ответа HTTP, обработчик ошибок или всю стратегию наблюдения.
InternetObservingSettings settings = InternetObservingSettings.builder()
.initialInterval(initialInterval)
.interval(interval)
.host(host)
.port(port)
.timeout(timeout)
.httpResponse(httpResponse)
.errorHandler(testErrorHandler)
.strategy(strategy)
.build();
ReactiveNetwork
.observeInternetConnectivity(settings)
.subscribeOn(Schedulers.io())
.observeOn(HarmonySchedulers.mainThread())
.subscribe(isConnectedToInternet -> {
// делаем что-то со значением isConnectedToInternet
},
throwable -> { /* обрабатываем ошибку здесь */} ););
Эти методы созданы для того, чтобы пользователи могли... Для полной настройки библиотеки и предоставления пользователям большего контроля.
Обратите внимание, что не все параметры применимы ко всем стратегиям.
Если мы не хотим отслеживать подключение к интернету в интервале с помощью метода Observable<Boolean> observeInternetConnectivity(...)
,
мы можем использовать Single<Boolean> checkInternetConnectivity()
, который делает то же самое, но только один раз.
Это может быть полезно в определённых случаях использования.
Single<Boolean> single = ReactiveNetwork.checkInternetConnectivity();
single
.subscribeOn(Schedulers.io())
.observeOn(HarmonySchedulizers.mainThread())
.subscribe(isConnectedToInternet -> {
// сделать что-то с isConnectedToTheInternet
},
throwable -> { /* обработать ошибку здесь */} ););
Как и в предыдущем случае, вы можете настроить эту функцию с помощью класса InternetObservingSettings
и его компоновщика.
InternetObservingSettings settings = InternetObservingSettings.builder()
.initialInterval(initialInterval)
.interval(interval)
.host(host)
.port(port)
.timeout(timeout)
.httpResponse(httpResponse)
.errorHandler(testErrorHandler)
.strategy(strategy)
.build();
Single<Boolean> single = ReactiveNetwork.checkInternetConnectivity(settings);
single
.subscribeOn(Schedulers.io())
.observeOn(HarmonySchedulers.mainThread())
.subscribe(isConnectedToInternet -> {
// сделать что-то с isConnectedToTheInternet
},
throwable -> { /* обработать ошибку здесь */} ););
Основная идея та же. У нас есть только возвращаемый тип Single<Boolean>
вместо Observable<Boolean>
и у нас нет параметров int initialIntervalInMs
и int intervalInMs
.
Как и ранее, эти методы созданы для того, чтобы позволить пользователям полностью настроить библиотеку и предоставить им больше контроля.
Сейчас у нас есть следующие стратегии отслеживания подключения к интернету:
SocketInternetObservingStrategy
— отслеживает подключение к интернету через открытие соединения сокета с удалённым хостом;WalledGardenInternetObservingStrategy
— открывает соединение с удалённым хостом и учитывает страны в «Китайской стене» (например, Китай).Все эти стратегии реализуют интерфейс NetworkObservingStrategy
. В настоящее время используется стратегия по умолчанию WalledGardenInternetObservingStrategy
,
но с методами checkInternetConnectivity(strategy)
и observeInternetConnectivity(strategy)
мы можем явно использовать одну из этих стратегий.
Если вы хотите пинговать пользовательский хост во время проверки подключения к интернету, рекомендуется использовать SocketInternetObservingStrategy
.
Вы можете сделать это следующим образом:
InternetObservingSettings settings = InternetObservingSettings.builder()
.host("www.yourhost.com")
.port(port)
.strategy(new SocketInternetObservingStrategy())
.build();
ReactiveNetwork
.observeInternetConnectivity(settings)
.subscribeOn(Schedulers.io())
.observeOn(HarmonySchedulers.mainThread())
.subscribe(isConnectedToHost -> {
// сделать что-то с isConnectedToHost
},
throwable -> { /* обработать ошибку здесь */} ););
Если вы хотите использовать WalledGardenInternetObservingStrategy
, обновите HTTP-ответ через InternetObservingSettings
. Например, установите его на 200
, потому что по умолчанию это 204
.
Ту же операцию можно выполнить с методом checkInternetConnectivity(strategy, host)
, который возвращает Single
вместо Observable
.
Допустим, мы хотим реагировать на каждое изменение подключения к сети и, если мы подключаемся к сети, проверять, подключена ли эта сеть к интернету. Мы можем сделать это следующим образом:
ReactiveNetwork
.observeNetworkConnectivity(getApplicationContext())
.flatMapSingle(connectivity -> ReactiveNetwork.checkInternetConnectivity())
.subscribeOn(Schedulers.io())
.observeOn(HarmonySchedulers.mainThread())
.subscribe(isConnected -> {
// isConnected может быть true или false
},
throwable -> { /* обработать ошибку здесь */} ););
В случае если мы получаем слишком много событий, связанных с изменениями сети, или мы... Использование библиотеки ReactiveNetwork
Инструкции по установке
Зависимости библиотеки ReactiveNetwork зависит от rxohos.har, rxjava3 и gson.
Чтобы использовать модуль ReactiveNetwork в своём примере приложения, добавьте следующую зависимость библиотеки для создания hap/library.har.
Измените файл build.gradle на уровне входа следующим образом:
dependencies {
implementation 'io.openharmony.tpc.thirdlib:Rxohos:1.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
implementation 'com.google.code.gson:gson:2.8.6'
implementation project(path: ':library')
}
Чтобы использовать ReactiveNetwork в отдельном приложении, добавьте следующие зависимости и «library.har» в папку libs модуля «entry».
Измените файл build.gradle на уровне входа следующим образом:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.har'])
implementation 'io.openharmony.tpc.thirdlib:Rxohos:1.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
implementation 'com.google.code.gson:gson:2.8.6'
}
Чтобы использовать ReactiveNetwork из удалённого репозитория в отдельном приложении, добавьте следующие зависимости в файл build.gradle уровня «entry».
Измените файл build.gradle на уровне входа следующим образом:
dependencies {
implementation 'io.openharmony.tpc.thirdlib:Rxohos:1.0.0'
implementation 'io.openharmony.tpc.thirdlib:ReactiveNetwork:1.0.2'
implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
implementation 'com.google.code.gson:gson:2.8.6'
}
Copyright 2016 Piotr Wittchen
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )