【问题标题】:Proper way to unregister a callback from an Application class从应用程序类注销回调的正确方法
【发布时间】:2021-02-16 15:39:21
【问题描述】:

我在我的应用程序中实现了一个自定义应用程序类,它在应用程序启动之前处理更新应用程序主题。

我还注册了一个网络回调,以便在每次连接发生变化时设置一个变量。

我的应用类是这样的:

Application.kt

package com.th3pl4gu3.mes.ui

.....

class MesApplication : Application() {

    companion object {
        @Volatile
        private var INSTANCE: MesApplication? = null

        fun getInstance() =
            INSTANCE ?: synchronized(this) {
                INSTANCE
                    ?: MesApplication().also { INSTANCE = it }
            }
    }

    override fun onCreate() {
        super.onCreate()

        // Assigns 'this' to the singleton object
        INSTANCE = this

        // Updates the application's theme
        updateAppTheme()

        // Start a network callback to monitor internet connection
        startNetworkCallback()
    }

    private fun startNetworkCallback(){
        try{
            val cm = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val builder = NetworkRequest.Builder()

            cm.registerNetworkCallback(builder.build(), object: ConnectivityManager.NetworkCallback(){
                override fun onAvailable(network: Network) {
                    super.onAvailable(network)
                    Log.v("INTERNET_TEST", "AC: Network Available")
                    Global.isNetworkConnected = true
                }

                override fun onLost(network: Network) {
                    super.onLost(network)
                    Log.v("INTERNET_TEST", "AC: Network Lost")
                    Global.isNetworkConnected = false
                }
            })
            Global.isNetworkConnected = false
        }catch (e: Exception){
            Global.isNetworkConnected = false
        }
    }

}

但是,从文档中,他们建议取消注册此回调,但 Application 类生命周期没有任何 onPause 或 onDestroy 函数。

是否有任何适当的方法来取消注册此回调以不导致任何内存泄漏?

如果我编码错误,也可以随意提出任何替代方案

【问题讨论】:

    标签: android kotlin android-lifecycle application-lifecycle


    【解决方案1】:

    在这种情况下,您可以使用ActivityLifecycleCallbacks,来检测您的任何活动是否在Foreground中?

    ActivityLiveCycleListener

    class ActivityLiveCycleListener(private val appStateListener: AppStateListener) : Application.ActivityLifecycleCallbacks {
    
        companion object {
            var foregroundActivities = 0
        }
    
        override fun onActivityPaused(p0: Activity) {
    
        }
    
        override fun onActivityStarted(p0: Activity) {
            if(foregroundActivities == 0){
                appStateListener.onAppForeGround()
            }
            foregroundActivities++
        }
    
        override fun onActivityDestroyed(p0: Activity) {
    
        }
    
        override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
    
        }
    
        override fun onActivityStopped(p0: Activity) {
            foregroundActivities--
            if(foregroundActivities == 0){
                appStateListener.onAppBackground()
            }
        }
    
        override fun onActivityCreated(p0: Activity, p1: Bundle?) {
    
        }
    
        override fun onActivityResumed(p0: Activity) {
    
        }
    }
    

    您的界面可以有两种方法来指示背景/前景状态

    interface AppStateListener{
        fun onAppForeGround()
        fun onAppBackground()
    }
    

    现在申请onCreate(),注册到ActivityLifeCycleListener

    override fun onCreate(){
        registerActivityLifecycleCallbacks(ActivityLiveCycleListener(object : AppStateListener{
                override fun onAppForeGround() {
                    //start network listener
                }
    
                override fun onAppBackground() {
                    //remove network listener
                }
            }))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-03
      • 2014-09-24
      • 2019-09-20
      • 2017-02-09
      • 2011-03-31
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多