Tôi có một đối tượng tùy chỉnh, đơn giản Serializable
Tôi muốn lưu vào bộ nhớ cache và đọc khi khởi chạy lại. Dữ liệu của tôi là rất nhỏ, khoảng 25 đối tượng và nhiều nhất là 5 danh sách vì vậy tôi nghĩ rằng SQLite sẽ là quá mức cần thiết. Trong thế giới iPhone, tôi sẽ sử dụng NSKeyedArchiver
và NSKeyedUnarchiver
hoạt động tốt. Trên Android, tôi đã cố gắng thực hiện điều này với một số FileOutputStream
và ObjectOutputStream
và trong khi kết quả là như nhau, hiệu suất là khủng khiếp. Có cách nào tốt hơn (đọc nhanh hơn) để lưu bộ nhớ cache các đối tượng nhỏ vào hệ thống tệp trong Android không?Cách tốt nhất để dữ liệu bộ nhớ cache trong Android
Trả lời
Đối với những gì tôi đáng giá một số dữ liệu String của tôi vào đĩa bằng BufferedWriter/BufferedReader và nó rất nhanh. Vấn đề của thực tế nó là nhanh hơn so với lưu trữ cùng một dữ liệu để SharedPreferences. Mã này đi một cái gì đó như thế này (lưu ý rằng sự việc xảy ra nhanh hơn khi bạn cung cấp kích thước bộ đệm)
final BufferedWriter out = new BufferedWriter(new FileWriter(file), 1024);
out.write(stuff);
out.close();
Vâng, vấn đề là tôi muốn "công cụ" để được các đối tượng serialized của tôi mà vì lý do gì có vẻ là vấn đề. –
Vâng, nếu các đối tượng của bạn đủ đơn giản, bạn có thể ghi đè lên readObject và writeObject – Bostone
Vì vậy, tôi đã chỉ viết văn bản JSON thô vào một tệp bằng cách sử dụng phương pháp này và sau đó phân tích cú pháp khi tôi khởi chạy. Vì JSON có kích thước nhỏ nên dường như nó thực hiện OK, mặc dù tôi vẫn không hoàn toàn hài lòng khi không thể sắp xếp các đối tượng của mình vào đĩa. –
Thật khó để biết mà không profiling nhưng tôi đoán là hiệu suất kém của bạn là xuống để sử dụng ObjectOutputStream
. Bạn đã thử viết writeObject(ObjectOutputStream)
and readObject(ObjectOutputStream)
methods của riêng mình vì điều này có thể giúp hiệu suất.
Bạn có thể sử dụng công cụ traceview
để xem chính xác nơi ứng dụng đang chạy chậm. Có một cái nhìn at this question for instructions on how to use traceview
.
public class MyClass implements Serializable
{
private static final long serialVersionUID = 1L;
public String title;
public String startTime;
public String endTime;
public String day;
public boolean classEnabled;
public MyClass(String title, String startTime, boolean enable) {
this.title = title;
this.startTime = startTime;
this.classEnabled = enable;
}
public boolean saveObject(MyClass obj) {
final File suspend_f=new File(SerializationTest.cacheDir, "test");
FileOutputStream fos = null;
ObjectOutputStream oos = null;
boolean keep = true;
try {
fos = new FileOutputStream(suspend_f);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
} catch (Exception e) {
keep = false;
} finally {
try {
if (oos != null) oos.close();
if (fos != null) fos.close();
if (keep == false) suspend_f.delete();
} catch (Exception e) { /* do nothing */ }
}
return keep;
}
public MyClass getObject(Context c) {
final File suspend_f=new File(SerializationTest.cacheDir, "test");
MyClass simpleClass= null;
FileInputStream fis = null;
ObjectInputStream is = null;
try {
fis = new FileInputStream(suspend_f);
is = new ObjectInputStream(fis);
simpleClass = (MyClass) is.readObject();
} catch(Exception e) {
String val= e.getMessage();
} finally {
try {
if (fis != null) fis.close();
if (is != null) is.close();
} catch (Exception e) { }
}
return simpleClass;
}
và gọi từ hoạt động
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCustomObject");
else
cacheDir= getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
MyClass m = new MyClass("umer", "asif", true);
boolean result = m.saveObject(m);
if(result)
Toast.makeText(this, "Saved object", Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Error saving object", Toast.LENGTH_LONG).show();
MyClass m = new MyClass();
MyClass c = m.getObject(this);
if(c!= null)
Toast.makeText(this, "Retrieved object", Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Error retrieving object", Toast.LENGTH_LONG).show();
không quên sử dụng quyền write_external_storage trong file manifest.
- 1. Cách xóa bộ nhớ cache Android
- 2. Cách tốt nhất để tải dữ liệu ngoài trong android
- 3. IE8 getJSON Dữ liệu được lưu trong bộ nhớ cache
- 4. Làm cách nào để xem bộ nhớ cache trong Android?
- 5. Khuôn khổ bộ nhớ cache tốt nhất cho Java
- 6. Làm cách nào để triển khai bộ nhớ cache hình ảnh trong bộ nhớ trong Android?
- 7. Cách tốt nhất để lưu trữ dữ liệu
- 8. Phương pháp tốt nhất để buộc hết hạn bộ nhớ cache trong ASP.NET là gì?
- 9. Sử dụng biến tĩnh cho dữ liệu bộ nhớ cache
- 10. Cách tốt nhất để xóa bộ nhớ cache CSS của Plone là gì?
- 11. Android - Bộ nhớ cache bitmap chiếm rất nhiều bộ nhớ
- 12. Chiến lược lưu bộ nhớ cache, Bộ nhớ cache đầu ra so với Bộ nhớ cache dữ liệu hoặc cả hai?
- 13. Bộ nhớ cache bản vẽ Android
- 14. Android: Xóa bộ nhớ cache lập trình
- 15. Xóa dữ liệu người dùng hoặc Xóa bộ nhớ cache trên Phonegap android
- 16. Android & Admob lưu trữ dữ liệu không mong muốn và giá trị bộ nhớ cache
- 17. Android: Chiến lược bộ nhớ cache hình ảnh và bộ nhớ cache kích thước
- 18. Android tính toán bộ nhớ cache và kích thước dữ liệu như thế nào?
- 19. Làm cách nào để buộc Windows xóa tất cả dữ liệu bộ nhớ cache trên đĩa?
- 20. Cách tốt nhất để lập chỉ mục dữ liệu bảng cơ sở dữ liệu trong Solr?
- 21. Grails \ Hibernate: Để lưu bộ nhớ cache hoặc không lưu vào bộ nhớ cache?
- 22. bộ nhớ cache chia sẻ bộ nhớ trong bộ nhớ actorecord
- 23. Cách tốt nhất để tải hình ảnh vào bộ nhớ?
- 24. Dữ liệu NSDataWithContentsOfURL cache
- 25. Cấu trúc dữ liệu tốt nhất cho bảng tra cứu trong bộ nhớ này là gì?
- 26. Giữ dữ liệu trong bộ nhớ
- 27. Cách tốt nhất để sử dụng dữ liệu bộ nhớ đệm trong js ở phía khách hàng là gì?
- 28. Bộ nhớ cache, tắt bộ nhớ đệm
- 29. Làm cách nào để xử lý tệp bộ nhớ cache?
- 30. Tải bộ nhớ cache khi ngoại tuyến trong Android Webview
Bạn có biết phần nào là hiệu suất hoạt động không? –