【问题标题】:How to instantiate Presenter in AppWidgetProvider?如何在 AppWidgetProvider 中实例化 Presenter?
【发布时间】:2021-10-22 15:55:41
【问题描述】:

我正在尝试使用带有 AppWidgetProvider 的演示者。

我有一个实例变量如下

private latelinit var presenter: Presenter

然后在onEnabled 中,我设置了演示者。然后在onUpdate 内部,我正在使用演示者。

    override fun onEnabled(context: Context?) {
        Log.d("DEBUG", "Inside onEnabled")
        setPresenter(Presenter(this))
        super.onEnabled(context)
    }
    
    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        Log.d("DEBUG", "Inside onUpdate")
        presenter!!.onUpdate(context, appWidgetIds)
    }

    override fun setPresenter(presenter: Presenter) {
        this.presenter = presenter
        Log.d("DEBUG", "Inside onSetPresenter Presenter set")
    }

根据日志,onEnabledonUpdate 之前被调用,这是我所期望的。但是,当我在 onUpdate 中使用 Presenter 时,它会抱怨 Presenter 没有被初始化。

在 AppWidgetProvider 中设置 Presenter 的正确方法是什么?

【问题讨论】:

    标签: android kotlin android-appwidget appwidgetprovider


    【解决方案1】:

    在 AppWidgetProvider 中设置 Presenter 的正确方法是什么?

    你不会“设置”它。最多可以在onUpdate() 中创建一个实例并使用它。

    AppWidgetProvider 是清单注册的BroadcastReceiverAppWidgetProvider 的一个实例将用于单个回调,然后被丢弃。将数据存储在 AppWidgetProvider 的属性中,例如您的演示者,是没有用的。

    【讨论】:

    • 有趣。因此,如果我必须使用带有 AppWidgetProvider 的演示者,我是否必须在每次调用 onUpdate 时实例化一个新的演示者?我想使用演示者来更好地组织代码。这是否也意味着静态变量是严格禁止的,并且在处理 AppWidgetProviders 时,将共享首选项用于任何类型的缓存都是正确的方法。谢谢,马克!图例:D
    • @suhas_sm:“所以,如果我必须将 Presenter 与 AppWidgetProvider 一起使用,我是否必须在每次调用 onUpdate 时都实例化一个新的 Presenter?” - 是的。 “这是否也意味着静态变量是严格禁止的” - 使用静态变量通常仅用于缓存。特别是,在这种情况下,不能保证在您的AppWidgetProvider 上的两个后续回调调用之间会是相同的过程。 “使用共享首选项进行任何类型的缓存都是正确的方法”——如果您需要保存数据,则需要某种形式的持久性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多