什么时候应该使用资产而不是Android中的原始资源?


151

我正在学习Android,目前只涉及Assets和Raw资源。我试图了解使用原始资源与资产的原因。

  1. 它们都提供了未编译的资源输入流。

  2. 资产似乎比原始资源提供了更多的灵活性和功能。

    一个。您可以创建文件夹结构下,assets而不是在raw

    b。您可以在assets文件夹中动态列出所有资源,但不能在raw文件夹中列出。

那么,为什么我要在Android中使用Raw资源?


Answers:


182

raw文件夹和assets文件夹之间的主要区别。

  • 由于raw是Resources(res)的子文件夹,因此Android会自动ID为其中的任何文件生成。这 ID随后被存储在R class将充当一个文件的引用,这意味着它可以从其他Android类和方法,甚至在Android的XML文件可以轻松访问。使用自动生成的ID是访问Android中文件的最快方法。

  • assets文件夹是一个“附录”目录。的R类别不产生标识为放置在那里的文件,这与部分Android类和方法不太相容。文件assets夹中的文件访问速度较慢,因为您将需要基于String获取该文件的句柄。但是,通过将文件放置在此文件夹中,可以更轻松地完成某些操作,例如将数据库文件复制到系统的内存中。没有(简便)的方法来创建对Assets文件夹中文件的Android XML引用。


4
@ user370305您好,现在新的Android操作系统仍存在1MB的限制吗?我找不到任何有关此的文档。您知道在哪里可以找到它吗?
GMsoF


2
@GMsoF-有很多技巧可以将文件大小大于1 mb放在/asset目录中。
user370305

10
我从没有对Assets文件夹的文件大小进行限制。您确定有这样的事情吗?
android开发人员

2
是的,在Android 2.2或2.3之前的版本中,无法从APK读取任何未压缩大小超过1 MB的压缩资产文件。在这里提到groups.google.com/forum/#!topic/android-developers/lguGFJD-JRs
user370305 2014年

33

Android文档,该raw/目录用于:

以原始格式保存的任意文件。要使用原始InputStream打开这些资源,请使用资源ID(即R.raw.filename 调用Resources.openRawResource()

但是,如果需要访问原始文件名和文件层次结构,则可以考虑将一些资源保存在assets/目录中(而不是res / raw /)。没有给Assets /中的文件提供资源ID,因此您只能使用AssetManager读取它们。


一行中,raw/目录中的文件不是由平台编译的没有分配资源ID并且不能分组为子文件夹,而如果需要,请使用该assets/目录。


1
如果要将大文件复制到存储文件夹,原始文件是最佳选择吗?
现场直播

@ 40-Love 除非您支持较早版本否则对Android 2.3及更高版本的文件大小没有限制您可以根据需要选择任何存储文件夹。主要区别是访问这些文件的方式。
2015年

1

除了以上给出的答案...

/ res / strings,/ res / layout,/ res / xml文件等都被编译成二进制格式。但是,如果将包括XML文件在内的文件放在/ res / raw /目录中,则它们不会被编译成二进制格式。

使用资产而不是原始资源的一大优势是 file:///android_asset/ Uri前缀。这对于将资产加载到WebView中很有用。例如,要访问位于项目内Assets / foo / index.html中的资产,可以调用 loadUrl("file:///android_asset/foo/index.html")将HTML加载到WebView中。


您可以使用 file:///android_res/前缀指向原始资源。
androidguy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.