Kiedy należy używać zasobów, a nie surowych zasobów w systemie Android?

151

Jestem w połowie moich studiów dotyczących Androida i właśnie omówiłem zasoby i zasoby surowe. Próbuję zrozumieć powód używania surowych zasobów w porównaniu z zasobami.

  1. Oba zapewniają nieskompilowany strumień wejściowy zasobów.

  2. Wydaje się, że zasoby zapewniają znacznie większą elastyczność i funkcjonalność niż zasoby surowe.

    za. Struktury folderów można tworzyć pod, assetsale nie podraw

    b. Możesz dynamicznie wyświetlić listę wszystkich zasobów w assetsfolderze, ale nie w rawfolderze.

Dlaczego więc miałbym używać zasobów Raw w systemie Android?

Mortalus
źródło
Możliwy duplikat różnicy między katalogami / res i /
asset

Odpowiedzi:

182

Główne różnice między rawfolderem a assetsfolderem.

  • Ponieważ raw jest podfolderem zasobów (res), system Android automatycznie wygeneruje plik IDdla każdego znajdującego się w nim pliku. Jest IDto następnie przechowywane w R classpliku, który będzie działał jako odniesienie do pliku, co oznacza, że ​​można go łatwo uzyskać z innych klas i metod systemu Android, a nawet z plików XML systemu Android. Korzystanie z automatycznie generowanego identyfikatora to najszybszy sposób na uzyskanie dostępu do pliku w systemie Android.

  • assetsFolderu jest „dodatek” katalogu. Klasa R nie generuje identyfikatory dla plików umieszczonych tam, co jest mniej kompatybilny z niektórych klas i metod Android. Dostęp do pliku w assetsfolderze jest wolniejszy, ponieważ będziesz musiał uzyskać do niego uchwyt oparty na łańcuchu . Jednak niektóre operacje są łatwiejsze do wykonania poprzez umieszczenie plików w tym folderze, na przykład skopiowanie pliku bazy danych do pamięci systemu. Nie ma (łatwego) sposobu na utworzenie odwołania XML systemu Android do plików w folderze Zasoby.

user370305
źródło
4
@ user370305 Cześć, czy ograniczenie 1 MB nadal istnieje dla nowego systemu operacyjnego Android? Nie mogę znaleźć żadnej dokumentacji, która o tym mówi. Czy masz pomysł, gdzie mogę to znaleźć?
GMsoF
6
@GMsoF - Nie ma na to żadnego konkretnego dokumentu. Ale mam dla Ciebie przydatne linki. 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 i 5. android-developers.blogspot.in/2012/03/ ... Po prostu przejdź zgodnie z nr sr.
user370305
2
@GMsoF - Jest wiele sztuczek, aby umieścić w katalogu rozmiar pliku większy niż 1 MB /asset.
user370305
10
nigdy nie miałem ograniczenia rozmiaru pliku dla folderu zasobów. czy na pewno istnieje coś takiego?
programista Androida
2
Tak, przed Androidem 2.2 lub 2.3 żaden skompresowany plik zasobów o nieskompresowanym rozmiarze przekraczającym 1 MB nie może być odczytany z APK. O czym tutaj wspomniano groups.google.com/forum/#!topic/android-developers/lguGFJD-JRs
user370305
33

Z dokumentacji Android The raw/katalog służy do:

Dowolne pliki do zapisania w postaci surowej. Aby otworzyć te zasoby za pomocą surowego InputStream , wywołaj Resources.openRawResource () z identyfikatorem zasobu, którym jest R.raw.filename .

Jeśli jednak potrzebujesz dostępu do oryginalnych nazw plików i hierarchii plików, możesz rozważyć zapisanie niektórych zasobów w assets/katalogu (zamiast res / raw /) . Pliki w zasobach / nie mają identyfikatora zasobu, więc możesz je odczytać tylko za pomocą AssetManager .


W jednym wierszu pliki w raw/katalogu niekompilowane przez platformę , mają przypisany identyfikator zasobu i nie mogą być grupowane w podfoldery, podczas gdy jeśli chcesz, użyj assets/katalogu.

Książę
źródło
1
Czy pliki RAW są najlepszą opcją, jeśli chcesz skopiować duży plik do folderu przechowywania?
miłość na żywo
@ 40-Love Nie ma ograniczeń co do rozmiaru pliku dla Androida 2.3 i nowszych, chyba że obsługujesz wcześniejsze wersje. Możesz wybrać dowolny folder do przechowywania w zależności od wymagań. Główną różnicą jest sposób uzyskiwania dostępu do tych plików.
Prince
1

Dodając do odpowiedzi podanych powyżej ...

Pliki / res / strings, / res / layout, / res / xml itp. są kompilowane do formatu binarnego. Ale jeśli umieścisz pliki, w tym pliki XML, w katalogu / res / raw / zamiast tego, nie zostaną one skompilowane do formatu binarnego.

Dużą zaletą używania zasobów zamiast surowych zasobów jest prefiks file:///android_asset/ Uri, który jest przydatny do ładowania zasobu do WebView. Na przykład, aby uzyskać dostęp do zasobu znajdującego się w asset / foo / index.html w projekcie, możesz wywołać loadUrl("file:///android_asset/foo/index.html")ładowanie tego kodu HTML do WebView.

Shubhamhackz
źródło
Możesz użyć file:///android_res/przedrostka do wskazania surowego zasobu.
androidguy