Android Library&单身上下文

时间:2018-03-28 14:51:56

标签: android kotlin singleton android-context

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

创建String扩展,这是有效的,没有问题。

扩展调用单个函数中的函数返回结果,这种方法正常,因为我在单例的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中一次。

1 个答案:

答案 0 :(得分:0)

从图书馆设计的角度来看,我最有可能将Context完全排除在等式之外,并以与通用现有界面协同工作的方式设计我的API。

对于您提出的问题,是什么阻碍您简单地设计一个API,该API需要InputStream参数来读取CSV数据并相应地处理它们?然后,来电者网站可以使用context.resources.openRawResource(R.raw.csv_file)context.assets.open("test.csv")或任何其他可以使用原始CSV内容返回InputStream的内容。

作为一个优点,您可以通过使用可以轻松创建的ByteArrayInputStream填充输入数据来轻松测试我们新的,花哨的API。最后,您的库上几乎没有Android依赖,因此您的测试和生产代码可以在任何JVM上运行。