【问题标题】:Android Library & Singleton ContextAndroid 库和单例上下文
【发布时间】:2018-09-07 07:56:34
【问题描述】:

我正在创建一个库(使用 Kotlin)并且需要创建一个字符串扩展来搜索 ArrayList 并返回一个值。由于扩展会被多次调用,我只想加载 ArrayList 一次并重用它,所以到目前为止我的方法是这样的:

创建字符串扩展,这可以正常工作,没有问题。

扩展在单例中调用一个返回结果的函数,这种方法有效,因为我在单例的 init 中手动创建了 ArrayList。最终解决方案需要从 res/raw 文件夹中读取一个 .csv 文件,然后创建 ArrayList,这就是我的问题开始的地方。

我正在努力寻找读取 .csv 文件的示例,目前我有一个解决方案(测试应用程序,而不是库),它使用以下代码行从 /app/src/main/assets 读取 .csv :

       applicationContext.assets.open("test.csv").bufferedReader().use {}

这是读取文件的最佳方法吗,/res/raw 似乎更合乎逻辑?

假设我当前的方法是好的,只要我将此代码移入我的库并在单例中使用它,我就会遇到与上下文相关的问题。我不希望扩展必须将上下文传递给单例,理想情况下我希望单例的 init 能够获取上下文。

总而言之...我正在尝试在库中找到我的 Singleton 访问上下文的方法,以便 .csv 文件只能加载到 ArrayList 中一次。

【问题讨论】:

  • 查看这篇文章:stackoverflow.com/a/16053523/5125812 和这篇文章:stackoverflow.com/a/9421473/5125812 -- 还要小心在单例中持有对上下文的引用,确保您正在使用应用程序上下文。我的建议是让您的库尽可能不了解 Android,也许您将所需的数据加载到其他地方,然后将其传递到您的库中?

标签: android kotlin singleton android-context


【解决方案1】:

从库设计的角度来看,我很可能将Context 完全排除在外,并设计我的 API,使其与通用的现有接口一起工作。

对于您给定的问题,是什么阻止您简单地设计一个需要 InputStream 参数来读取 CSV 数据并相应地处理它们的 API?然后,调用方站点可以通过 context.resources.openRawResource(R.raw.csv_file)context.assets.open("test.csv") 或任何其他方式使用它,以返回带有原始 CSV 内容的 InputStream

此外,您还可以通过使用可以轻松创建的ByteArrayInputStream 填充输入数据来轻松测试我们新奇的 API。最后,您的库实际上没有 Android 依赖项,因此您的测试和生产代码可以在任何 JVM 上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多