首页 > 解决方案 > 有没有更好的方法将上下文传递给辅助 kotlin 类?

问题描述

我的应用程序包含三个类:

Map包含 google map 方法,DataWriter包含 File writer 方法,只要在运行时IsWriteEnabled()上进行写入存储权限检查。

我从Map调用IsWriteEnabled()以便我可以通过以下方式检查我是否有权限:

class Map : Fragment() , OnMapReadyCallback {

    private lateinit var mdataWriter: DataWriter

// a lot of code removed

 override fun onMapReady(googleMap: GoogleMap) {
        mdataWriter = DataWriter(requireContext())
        mdataWriter.isWriteEnable()
    }

这是我的 DataWriter.kt

class DataWriter(val context: Context): AppCompatActivity(){

    fun isWriteEnable(): Boolean { 
        if (ActivityCompat.checkSelfPermission(
                context,   
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(
                context as Activity,
                arrayOf(
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                ),
                WRITE_REQUEST_CODE
            )
        } else {
            Log.e("DB", "PERMISSION GRANTED")
        }
        return true
    }

我的问题

有没有更好的方法将上下文传递给未附加到主要活动的类?对方法的调用是否应该如此?

标签: androidkotlin

解决方案


您可以自由地将 a 传递给一个未以任何您喜欢的方式Context附加到 an的类。Activity通过类的构造函数传递它是一种很好的做法(依赖注入),但仅在您的类需要Context完全正确运行的情况下。如果您需要 aContext仅在特定方法中使用,不妨将其作为参数传递给该方法。

在这里您必须注意的最重要的事情是 anActivity具有有限的生命周期。如果在类中保留对 an 的引用,Activity Context该类的寿命将超过 that Activity,则会造成内存泄漏:垃圾收集器将无法销毁它,Activity因为某处存在对它的引用。这就是为什么人们通常更喜欢处理一个Application Context而不是,它总是比你可以创建的任何类都要长。

现在,对您的代码进行更正:不要AppCompatActivity仅扩展为继承ActivityCompat。通过扩展AppCompatActivity,您授予类访问许多与您的类无关的生命周期管理、资源处理和用户交互方法。AppCompatActivity应该只Activities 扩展. 否则,它的名字不会以Activity结尾:)

作为处理用户交互的组件,请求权限是Activityor的职责Fragment,因此只需在Mapor中请求权限即可MainActivity。另外,我假设这Map确实在做 aFragment应该做的事情,而且你不仅仅是Fragment为了访问某些Fragment方法:)


推荐阅读