2010-01-05 35 views
24

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 NSKeyedArchiverNSKeyedUnarchiver 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ố FileOutputStreamObjectOutputStream 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

+0

Bạn có biết phần nào là hiệu suất hoạt động không? –

Trả lời

19

Đố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(); 
+1

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 đề. –

+0

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

+0

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. –

3

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.

4
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.

Các vấn đề liên quan