在另一个模块中使用应用上下文

Using application context in another module

我有一个像 FileLog 这样的单例 class,我想用它的一种方法创建一个文件,并且需要一个 Context 来完成它。我的问题是 FileLog class 被放置在另一个模块中,我无权访问应用程序模块上下文。你能告诉我如何使用 Hilt 或其他方式访问上下文吗?

已编辑 -------------------------->>>>><<<<<<------ ------------------

这是我的class是一个单身人士。如果我将上下文传递给它,我将面临内存泄漏。我只需要一个方法中的上下文,我不想将上下文作为参数传递给该方法。如果我访问一个 class 扩展 Application() 并且其中有一个静态上下文,我可以在 FileLog class 方法中使用它。

open class FileLog private constructor(context: Context) {
private lateinit var streamWriter: OutputStreamWriter
private var dateFormat: SimpleDateFormat? = null
private var currentFile: File? = null
private var networkFile: File? = null
private var tonlibFile: File? = null
private var initied = false
private var context: Context = context

companion object {
    lateinit var INSTANCE: FileLog

    @Synchronized
    fun getInstance(context: Context): FileLog {
        if (!Companion::INSTANCE.isInitialized) {
            INSTANCE = FileLog(context)
        }

        return INSTANCE
    }

 }
 fun initFileLog(context: Context) {
    Log.e("FileLog", "create file")

    if (initied) {
        return
    }
    dateFormat = SimpleDateFormat("dd_MM_yyyy_HH_mm_ss", Locale.US)
    try {
        val sdCard: File = context.getExternalFilesDir(null)
            ?: return
        val dir = File(sdCard.absolutePath + "/logs")
        dir.mkdirs()
        currentFile =
            File(dir, dateFormat?.format(System.currentTimeMillis()).toString() + ".txt")
    } catch (e: Exception) {
        e.printStackTrace()
    }
 }   

我想你也可以使用 object class 因为它只包含一个实例

object FileLos{
private lateinit var streamWriter: OutputStreamWriter
private var dateFormat: SimpleDateFormat? = null
private var currentFile: File? = null
private var networkFile: File? = null
private var tonlibFile: File? = null
private var initied = false

fun initFileLog(context: Context) {
    Log.e("FileLog", "create file")

    if (initied) {
        return
    }
    dateFormat = SimpleDateFormat("dd_MM_yyyy_HH_mm_ss", Locale.US)
    try {
        val sdCard: File = context.getExternalFilesDir(null)
            ?: return
        val dir = File(sdCard.absolutePath + "/logs")
        dir.mkdirs()
        currentFile =
            File(dir, dateFormat?.format(System.currentTimeMillis()).toString() + ".txt")
    } catch (e: Exception) {
        e.printStackTrace()
    }
}}

您可以在应用程序中公开应用程序上下文,而不是将上下文传递给方法 class:

class App : Application() {
    companion object {
        val context: App
            get() = contextReference.get()!! as App
    }
}

并像这样使用它:

App.context.getExternalFilesDir(null)

你的记录器真的需要Context吗?不,它需要 File 个外部文件目录。

fun initFileLog(sdCard: File) {
    Log.e("FileLog", "create file")

    if (initied) {
        return
    }
    dateFormat = SimpleDateFormat("dd_MM_yyyy_HH_mm_ss", Locale.US)
    try {
        val dir = File(sdCard.absolutePath + "/logs")
    ...
    }
}}

您可以从应用程序模块中提供这样的 File

根据经验,您应该避免 Android 模块中的依赖项,这样可以在更简单的环境中测试它们。