Иногда я помещаю виджет на домашний экран, он не обновляет интерфейс (он работает некорректно). После добавления виджета на главный экран я нажимаю кнопку refre sh, но он редко обновляет интерфейс виджета. Для целей тестирования я создал тестовый образец. В updateAppWidget я вызываю метод getRandomNumber, где я использую Rx Java. Там я выбрасываю случайное число. После этого я устанавливаю случайное число в textView с RemoteView, затем я обновляю пользовательский интерфейс, но пользовательский интерфейс редко обновляет
Вот мой код:
class SimpleWidget : AppWidgetProvider() {
companion object {
const val ACTION_REFRESH = BuildConfig.APPLICATION_ID + ".action.REFRESH_WIDGET"
}
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
// There may be multiple widgets active, so update all of them
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
}
@SuppressLint("CheckResult")
fun getRandomNumber(context: Context, appWidgetId: Int) {
val compositeDisposable = CompositeDisposable()
val number = Random.nextInt()
Log.d("myLogs", "random number = $number")
Observable.just(number)
.doOnSubscribe {
Log.d("myLogs", "onSubscribe")
compositeDisposable::add
showProgress(context)
}
.doOnTerminate {
Log.d("myLogs", "onTerminate")
compositeDisposable::clear
hideProgress(context)
}.subscribe({
Log.d("myLogs", "onNext")
handleResponse(context, it, appWidgetId)
}, {
Log.d("myLogs", "onError")
Toast.makeText(context, it.message, Toast.LENGTH_SHORT).show()
}, {
Log.d("myLogs", "onComplete")
})
}
private fun handleResponse(context: Context, number: Int, appWidgetId: Int) {
val views = RemoteViews(context.packageName, R.layout.simple_widget)
drawWidget(context, number, views, appWidgetId)
refreshWidget(context, views)
}
private fun drawWidget(context: Context, number: Int, views: RemoteViews, appWidgetId: Int) {
views.setTextViewText(R.id.tvNumber, number.toString())
}
private fun showProgress(context: Context) {
val views = RemoteViews(context.packageName, R.layout.simple_widget)
views.setViewVisibility(R.id.ivRefresh, View.GONE)
views.setViewVisibility(R.id.progress_bar, View.VISIBLE)
refreshWidget(context, views)
}
private fun hideProgress(context: Context) {
val views = RemoteViews(context.packageName, R.layout.simple_widget)
views.setViewVisibility(R.id.ivRefresh, View.VISIBLE)
views.setViewVisibility(R.id.progress_bar, View.GONE)
refreshWidget(context, views)
}
private fun refreshWidget(context: Context, views: RemoteViews) {
val appWidget = ComponentName(context, SimpleWidget::class.java)
val appWidgetManager = AppWidgetManager.getInstance(context)
appWidgetManager.updateAppWidget(appWidget, views)
}
private fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int
) {
val widgetText = context.getString(R.string.appwidget_text)
// Construct the RemoteViews object
val views = RemoteViews(context.packageName, R.layout.simple_widget)
val intent = Intent(context, SimpleWidget::class.java)
intent.action = SimpleWidget.ACTION_REFRESH
intent.putExtra(EXTRA_APPWIDGET_ID, appWidgetId)
val pendingIntent = PendingIntent.getBroadcast(
context,
appWidgetId,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.ivRefresh, pendingIntent)
getRandomNumber(context, appWidgetId)
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views)
}
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
if (intent.action == ACTION_REFRESH) {
val appWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, INVALID_APPWIDGET_ID)
getRandomNumber(context, appWidgetId)
}
}
}