Я создал простые приложения:
Приложение 1 предоставляет и модифицирует поставщика контента для совместного использования логического флага через uri.
Приложение 2 наблюдает за этим флагом, предоставленным приложением 1, с помощью ContentObserver, а также может изменять содержимое.
Когда Приложение 2 изменяет содержимое, метод onChange ContentObservers выполняется сразу же. Но если Приложение 1 изменяет содержимое, методу onChange всегда требуется ровно 10 секунд для распознавания и выполнения изменения.
Есть ли причина, по которой это всегда ровно 10 секунд, и как я могу сократить эта задержка.
Приложение 1
MyProvider.kt
class MyProvider : ContentProvider() {
companion object {
const val AUTHORITY = "pizza.xyz.cp1.provider"
private const val CODE_DIR = 1
private val MATCHER = UriMatcher(UriMatcher.NO_MATCH)
init {
MATCHER.addURI(
AUTHORITY,
"flag",
CODE_DIR
)
}
}
val appDatabase: AppDatabase? by lazy {
context?.let {
Room.databaseBuilder(
it,
AppDatabase::class.java,
"MyDataBase"
).fallbackToDestructiveMigration().build()
}
}
override fun onCreate(): Boolean {
return true
}
override fun insert(
uri: Uri,
values: ContentValues?
): Uri {
return when (MATCHER.match(uri)) {
CODE_DIR -> {
println("Writing flag in cp1: ${values?.getAsBoolean("flag")} ")
appDatabase?.flagDao()?.updateFlag(values?.getAsBoolean("flag") ?: false)
context?.contentResolver?.notifyChange(uri, null)
uri
}
else -> throw java.lang.IllegalArgumentException("Unknown URI: $uri")
}
}
@Nullable
override fun query(
uri: Uri,
@Nullable projection: Array?,
@Nullable selection: String?,
@Nullable selectionArgs: Array?,
@Nullable sortOrder: String?
): Cursor? {
return when (MATCHER.match(uri)) {
CODE_DIR -> {
val context = context ?: return null
val cursor: Cursor? = appDatabase?.flagDao()?.fetchFlag()
cursor?.setNotificationUri(context.contentResolver, uri)
cursor
}
else -> throw IllegalArgumentException("Unknown URI: $uri")
}
}
}
AndroidManifest
android:authorities="pizza.xyz.cp1.provider"
android:name=".MyProvider"
android:exported="true"
android:enabled="true"
android:multiprocess="true"
android:readPermission="pizza.xyz.PERMISSION"
android:writePermission="pizza.xyz.PERMISSION"/>
Приложение 2
ContentObserverFlow.kt
class ContentObserverFlow(private val contentResolver: ContentResolver, private val uri: Uri) : ContentObserver(
Handler(Looper.getMainLooper())
) {
private val _flow = MutableSharedFlow(extraBufferCapacity = 1)
val flow: Flow get() = _flow
init {
contentResolver.registerContentObserver(uri, true, this)
}
override fun onChange(selfChange: Boolean) {
println("change detected cp2")
_flow.tryEmit(Unit)
}
fun unregister() {
contentResolver.unregisterContentObserver(this)
}
}
AndroidManifest
Подробнее здесь: https://stackoverflow.com/questions/783 ... ect-change
Content Observer onChange обнаруживает изменение в течение 10 секунд. ⇐ Android
Форум для тех, кто программирует под Android
1713003692
Anonymous
[b]Я создал простые приложения:[/b]
[b]Приложение 1[/b] предоставляет и модифицирует поставщика контента для совместного использования логического флага через uri.
[b]Приложение 2[/b] наблюдает за этим флагом, предоставленным приложением 1, с помощью ContentObserver, а также может изменять содержимое.
Когда Приложение 2 изменяет содержимое, метод onChange ContentObservers выполняется сразу же. Но если Приложение 1 изменяет содержимое, методу onChange всегда требуется ровно 10 секунд для распознавания и выполнения изменения.
Есть ли причина, по которой это всегда ровно 10 секунд, и как я могу сократить эта задержка.
[b]Приложение 1[/b]
MyProvider.kt
class MyProvider : ContentProvider() {
companion object {
const val AUTHORITY = "pizza.xyz.cp1.provider"
private const val CODE_DIR = 1
private val MATCHER = UriMatcher(UriMatcher.NO_MATCH)
init {
MATCHER.addURI(
AUTHORITY,
"flag",
CODE_DIR
)
}
}
val appDatabase: AppDatabase? by lazy {
context?.let {
Room.databaseBuilder(
it,
AppDatabase::class.java,
"MyDataBase"
).fallbackToDestructiveMigration().build()
}
}
override fun onCreate(): Boolean {
return true
}
override fun insert(
uri: Uri,
values: ContentValues?
): Uri {
return when (MATCHER.match(uri)) {
CODE_DIR -> {
println("Writing flag in cp1: ${values?.getAsBoolean("flag")} ")
appDatabase?.flagDao()?.updateFlag(values?.getAsBoolean("flag") ?: false)
context?.contentResolver?.notifyChange(uri, null)
uri
}
else -> throw java.lang.IllegalArgumentException("Unknown URI: $uri")
}
}
@Nullable
override fun query(
uri: Uri,
@Nullable projection: Array?,
@Nullable selection: String?,
@Nullable selectionArgs: Array?,
@Nullable sortOrder: String?
): Cursor? {
return when (MATCHER.match(uri)) {
CODE_DIR -> {
val context = context ?: return null
val cursor: Cursor? = appDatabase?.flagDao()?.fetchFlag()
cursor?.setNotificationUri(context.contentResolver, uri)
cursor
}
else -> throw IllegalArgumentException("Unknown URI: $uri")
}
}
}
AndroidManifest
android:authorities="pizza.xyz.cp1.provider"
android:name=".MyProvider"
android:exported="true"
android:enabled="true"
android:multiprocess="true"
android:readPermission="pizza.xyz.PERMISSION"
android:writePermission="pizza.xyz.PERMISSION"/>
[b]Приложение 2[/b]
ContentObserverFlow.kt
class ContentObserverFlow(private val contentResolver: ContentResolver, private val uri: Uri) : ContentObserver(
Handler(Looper.getMainLooper())
) {
private val _flow = MutableSharedFlow(extraBufferCapacity = 1)
val flow: Flow get() = _flow
init {
contentResolver.registerContentObserver(uri, true, this)
}
override fun onChange(selfChange: Boolean) {
println("change detected cp2")
_flow.tryEmit(Unit)
}
fun unregister() {
contentResolver.unregisterContentObserver(this)
}
}
AndroidManifest
Подробнее здесь: [url]https://stackoverflow.com/questions/78320266/content-observer-onchange-takes-10-sec-to-detect-change[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия