有没有更好的方法可以将上下文传递给辅助Kotlin类?

时间:2019-08-31 21:26:47

标签: android kotlin

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

  • MainActivity类:AppCompatActivity()
  • 类Map:Fragment(),OnMapReadyCallback
  • DataWriter类(val上下文:Context):AppCompatActivity()

地图包含google地图方法, DataWriter 包含文件编写器方法,只要在运行时 IsWriteEnabled()具有写存储权限检查>

我从地图呼叫 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
    }

我的问题

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

1 个答案:

答案 0 :(得分:3)

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

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

现在,对您的代码进行更正:不要扩展AppCompatActivity只是继承ActivityCompat。通过扩展AppCompatActivity,您将向类授予与类无关的许多生命周期管理,资源处理和用户交互方法的访问权限。 AppCompatActivity应该仅由Activities扩展。否则,其名称不能以活动 :)

结尾

作为处理用户交互的组件,请求权限是ActivityFragment的责任,因此只需在MapMainActivity中请求权限。另外,我假设Map确实在执行Fragment应该做的事情,并且您不只是扩展Fragment来访问某些Fragment方法:)