在另一个模块中使用应用上下文
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 模块中的依赖项,这样可以在更简单的环境中测试它们。
我有一个像 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 模块中的依赖项,这样可以在更简单的环境中测试它们。