Khi nào tôi nên sử dụng các tài sản trái ngược với tài nguyên thô trong Android?


151

Tôi đang ở giữa các nghiên cứu về Android của mình và tôi chỉ đề cập đến Tài nguyên và Tài nguyên thô. Tôi đang cố gắng hiểu lý do sử dụng Tài nguyên thô so với Tài sản.

  1. Cả hai đều cung cấp một luồng đầu vào tài nguyên chưa biên dịch.

  2. Có vẻ như Tài sản cung cấp tính linh hoạt và chức năng cao hơn nhiều so với tài nguyên Nguyên.

    a. Bạn có thể tạo cấu trúc thư mục bên dưới assetsnhưng không dướiraw

    b. Bạn có thể liệt kê tất cả các tài nguyên động trong assetsthư mục nhưng không có trong rawthư mục.

Vậy, tại sao tôi lại sử dụng tài nguyên thô trong Android?


Câu trả lời:


182

Sự khác biệt chính giữa rawthư mục và assetsthư mục.

  • Vì raw là thư mục con của Tài nguyên (res), Android sẽ tự động tạo một IDtệp cho bất kỳ tệp nào nằm trong đó. Điều này IDsau đó được lưu trữ trong R classđó sẽ hoạt động như một tham chiếu đến một tệp, có nghĩa là nó có thể dễ dàng truy cập từ các lớp và phương thức Android khác và ngay cả trong các tệp Android XML. Sử dụng ID được tạo tự động là cách nhanh nhất để có quyền truy cập vào tệp trong Android.

  • Các assetsthư mục là một “phụ lục” thư mục. Lớp R không tạo ID cho các tệp được đặt ở đó, ít tương thích với một số lớp và phương thức Android. Truy cập tệp trong assetsthư mục chậm hơn vì bạn sẽ cần phải xử lý nó dựa trên Chuỗi . Tuy nhiên, một số thao tác được thực hiện dễ dàng hơn bằng cách đặt các tệp trong thư mục này, như sao chép tệp cơ sở dữ liệu vào bộ nhớ của hệ thống. Không có cách nào (dễ dàng) để tạo tham chiếu XML của Android cho các tệp trong thư mục Tài sản.


4
@ user370305 Xin chào, hiện tại giới hạn 1 MB vẫn còn cho hệ điều hành Android mới phải không? Tôi không thể tìm thấy bất kỳ tài liệu nói về điều này. Bạn có biết tôi có thể tìm thấy nó ở đâu không?
GMsoF

6
@GMsoF - Không có tài liệu cụ thể nào cho việc này. Nhưng tôi có một số liên kết hữu ích cho bạn. 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 và 5. android-developers.blogspot.in/2012/03/ Nhật Chỉ cần đi qua theo sr no.
dùng370305

2
@GMsoF - Có nhiều thủ thuật để đặt kích thước tệp lớn hơn 1 mb trong /assetthư mục.
dùng370305

10
tôi không bao giờ bị hạn chế kích thước tập tin cho thư mục tài sản. bạn có chắc là có một thứ như vậy không?
nhà phát triển Android

2
Có, trước Android 2.2 hoặc 2.3, mọi tệp tài sản nén có kích thước không nén trên 1 MB đều không thể đọc được từ APK. Được đề cập ở đây Groups.google.com/forum/#!topic/android-developers/lguGFJD-JRs
user370305

33

Từ tài liệu Android , raw/thư mục được sử dụng cho:

Các tập tin tùy ý để lưu ở dạng thô của chúng. Để mở các tài nguyên này bằng InputStream thô , hãy gọi Resources.openRawResource () với ID tài nguyên, đó là R.raw.filename .

Tuy nhiên, nếu bạn cần truy cập vào tên tệp gốc và phân cấp tệp, bạn có thể xem xét việc lưu một số tài nguyên trong assets/thư mục (thay vì res / raw /) . Các tệp trong tài sản / không được cung cấp ID tài nguyên, vì vậy bạn chỉ có thể đọc chúng bằng AssetManager .


Trong một dòng, các tệp trong raw/thư mục không được biên dịch bởi nền tảng , được gán ID tài nguyênkhông thể được nhóm vào các thư mục con trong khi nếu bạn muốn sử dụng assets/thư mục khác.


1
Các tệp thô có phải là tùy chọn tốt nhất nếu bạn muốn sao chép một tệp lớn vào thư mục lưu trữ không?
sống tình yêu

@ 40-Love Không có giới hạn về kích thước tệp cho Android 2.3 trở lên trừ khi bạn hỗ trợ các phiên bản cũ hơn. Bạn có thể chọn bất kỳ thư mục lưu trữ tùy thuộc vào yêu cầu của bạn. Một sự khác biệt chính là cách các tệp này được truy cập.
Hoàng tử

1

Thêm vào các câu trả lời ở trên ...

Các tập tin / res / chuỗi, / res / layout, / res / xml, v.v ... đều được biên dịch thành định dạng nhị phân. Nhưng nếu bạn đặt các tệp, bao gồm các tệp XML, trong thư mục / res / raw /, chúng sẽ không được biên dịch thành định dạng nhị phân.

Một lợi thế lớn của việc sử dụng tài sản so với tài nguyên thô là tiền tố file:///android_asset/ Uri. Điều này rất hữu ích để tải một tài sản vào WebView. Ví dụ: để truy cập một tài sản nằm trong tài sản / foo / index.html trong dự án của bạn, bạn có thể gọi loadUrl("file:///android_asset/foo/index.html")tải HTML đó vào WebView.


Bạn có thể sử dụng file:///android_res/tiền tố để trỏ đến một tài nguyên thô.
androidguy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.