Wann sollte ich die Assets im Gegensatz zu Rohstoffen in Android verwenden?

150

Ich bin mitten in meinen Android-Studien und habe gerade die Assets and Raw-Ressourcen behandelt. Ich versuche den Grund für die Verwendung von Rohstoffen im Vergleich zu Assets zu verstehen.

  1. Beide bieten einen nicht kompilierten Ressourcen-Eingabestream.

  2. Es scheint, dass Assets viel mehr Flexibilität und Funktionalität bieten als Raw-Ressourcen.

    ein. Sie können Ordnerstrukturen unter, assetsaber nicht unter erstellenraw

    b. Sie können alle Ressourcen dynamisch im assetsOrdner auflisten, jedoch nicht im rawOrdner.

Warum sollte ich Raw-Ressourcen in Android verwenden?

Mortalus
quelle

Antworten:

182

Die Hauptunterschiede zwischen dem rawOrdner und dem assetsOrdner.

  • Da raw ein Unterordner von Resources (res) ist, generiert Android automatisch einen IDfür jede darin befindliche Datei. Dies IDwird dann in der R classDatei gespeichert , die als Referenz auf eine Datei dient. Dies bedeutet, dass auf andere Android-Klassen und -Methoden und sogar in Android-XML-Dateien problemlos zugegriffen werden kann. Die Verwendung der automatisch generierten ID ist der schnellste Weg, um auf eine Datei in Android zuzugreifen.

  • Der assetsOrdner ist ein Anhangsverzeichnis . Die R-Klasse generiert keine IDs für die dort abgelegten Dateien, was mit einigen Android-Klassen und -Methoden weniger kompatibel ist. Der Dateizugriff im assetsOrdner ist langsamer, da Sie ein Handle basierend auf einem String benötigen . Einige Vorgänge lassen sich jedoch einfacher ausführen, indem Dateien in diesen Ordner gestellt werden, z. B. das Kopieren einer Datenbankdatei in den Systemspeicher. Es gibt keine (einfache) Möglichkeit, einen Android-XML-Verweis auf Dateien im Ordner "Assets" zu erstellen.

user370305
quelle
4
@ user370305 Hallo, gibt es die 1-MB-Beschränkung für neue Android-Betriebssysteme jetzt noch? Ich kann keine Dokumentation finden, die darüber spricht. Haben Sie eine Idee, wo ich sie finden kann?
GMsoF
6
@GMsoF - Hierfür gibt es kein spezifisches Dokument. Aber ich habe einige nützliche Links für Sie. 1. blog.rossgreenhalf.com/2010/12/13/android-file-size-limits 2. stackoverflow.com/questions/11276112/… 3. stackoverflow.com/questions/6809651/… 4. elinux.org/Android_aapt und 5. android-developers.blogspot.in/2012/03/… Gehen Sie einfach gemäß sr-Nr.
user370305
2
@GMsoF - Es gibt viele Tricks, um die Dateigröße größer als 1 MB in das /assetVerzeichnis zu stellen.
user370305
10
Ich hatte nie eine Einschränkung der Dateigröße für den Assets-Ordner. Bist du sicher, dass es so etwas gibt?
Android-Entwickler
2
Ja, vor Android 2.2 oder 2.3 kann keine komprimierte Asset-Datei mit einer unkomprimierten Größe von über 1 MB aus dem APK gelesen werden. Was hier erwähnt wird groups.google.com/forum/#!topic/android-developers/lguGFJD-JRs
user370305
33

In der Android-Dokumentation wird das raw/Verzeichnis verwendet für:

Beliebige Dateien, die in ihrer Rohform gespeichert werden sollen. Um diese Ressourcen mit einem unformatierten InputStream zu öffnen , rufen Sie Resources.openRawResource () mit der Ressourcen-ID R.raw.filename auf .

Wenn Sie jedoch Zugriff auf die ursprünglichen Dateinamen und die Dateihierarchie benötigen, können Sie einige Ressourcen im assets/Verzeichnis speichern (anstelle von res / raw /) . Dateien in Assets / erhalten keine Ressourcen-ID, sodass Sie sie nur mit AssetManager lesen können .


In einer Zeile werden die Dateien im raw/Verzeichnis nicht von der Plattform kompiliert , erhalten eine Ressourcen-ID und können nicht in Unterordnern gruppiert werden, wenn Sie das assets/Verzeichnis anderweitig verwenden möchten .

Prinz
quelle
1
Sind Rohdateien die beste Option, wenn Sie eine große Datei in den Speicherordner kopieren möchten?
Live-Liebe
@ 40-Love Es gibt keine Einschränkung der Dateigröße für Android 2.3 und höher, es sei denn, Sie unterstützen frühere Versionen. Sie können je nach Anforderung einen beliebigen Speicherordner auswählen. Ein wesentlicher Unterschied ist die Art und Weise, wie auf diese Dateien zugegriffen wird.
Prinz
1

Hinzufügen zu den oben gegebenen Antworten ...

/ res / strings, / res / layout, / res / xml-Dateien usw. werden alle im Binärformat kompiliert. Wenn Sie jedoch Dateien, einschließlich XML-Dateien, im Verzeichnis / res / raw / ablegen, werden sie nicht im Binärformat kompiliert.

Ein großer Vorteil der Verwendung von Assets gegenüber Rohstoffen ist das file:///android_asset/ Uri- Präfix. Dies ist nützlich, um ein Asset in eine WebView zu laden. Wenn Sie beispielsweise auf ein Asset zugreifen loadUrl("file:///android_asset/foo/index.html")möchten, das sich in der Datei resources / foo / index.html in Ihrem Projekt befindet, können Sie das Laden dieses HTML-Codes in WebView aufrufen.

Shubhamhackz
quelle
Sie können das file:///android_res/Präfix verwenden, um auf eine Rohressource zu verweisen.
androidguy