Часто виджет не обновляется после нажатия кнопки refre sh? - PullRequest
0 голосов
/ 23 марта 2020

Иногда я помещаю виджет на домашний экран, он не обновляет интерфейс (он работает некорректно). После добавления виджета на главный экран я нажимаю кнопку 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)
        }
    }
}
...