2010-01-05 13 views
24

मेरे पास ArrayList कस्टम, सरल Serializable ऑब्जेक्ट्स है जो मैं डिस्क पर कैश करना चाहता हूं और पुनः लॉन्च पर पढ़ना चाहता हूं। मेरा डेटा बहुत छोटा है, लगभग 25 ऑब्जेक्ट्स और अधिकांश 5 सूचियों में, इसलिए मुझे लगता है कि SQLite अधिक हो जाएगा। आईफोन की दुनिया में मैं NSKeyedArchiver और NSKeyedUnarchiver का उपयोग करता हूं जो बहुत अच्छा काम करता है। एंड्रॉइड पर मैंने इसे FileOutputStream और ObjectOutputStream के साथ करने का प्रयास किया है और परिणाम समान है, प्रदर्शन भयानक है। Android में फ़ाइल सिस्टम में छोटी ऑब्जेक्ट्स को कैश करने के लिए कोई बेहतर (तेज़ पढ़ें) तरीका है?एंड्रॉइड में डेटा कैश करने के लिए सर्वश्रेष्ठ तरीका

+0

क्या आप जानते हैं कि प्रदर्शन हॉग कौन सा हिस्सा है? –

उत्तर

19

इसके लिए मैं अपने कुछ स्ट्रिंग डेटा को BufferedWriter/BufferedReader का उपयोग करके डिस्क पर कैश करता हूं और यह बहुत तेज़ है। तथ्य यह है कि साझा डेटा को समान डेटा संग्रहीत करने से तेज़ है। कोड कुछ इस तरह (ध्यान दें कि चीजों को तेजी से हो सकता है जब आप बफर आकार प्रदान करते हैं)

final BufferedWriter out = new BufferedWriter(new FileWriter(file), 1024); 
out.write(stuff); 
out.close(); 
+1

हाँ, समस्या यह है कि मैं "सामान" चाहता हूं कि मेरी धारावाहिक वस्तुएं हों जो किसी भी कारण से समस्या का प्रतीत होता है। –

+0

ठीक है अगर आपकी ऑब्जेक्ट्स काफी सरल हैं तो आप readObject को ओवरराइट कर सकते हैं और लिख सकते हैं ऑब्जेक्ट – Bostone

+0

इसलिए मैंने इस विधि का उपयोग करके फ़ाइल में कच्चे JSON टेक्स्ट को लिखना समाप्त कर दिया और फिर लॉन्च होने पर इसे फिर से पार्स कर दिया। चूंकि JSON छोटा है, ऐसा लगता है कि यह ठीक है, हालांकि मैं अभी भी पूरी तरह से खुश नहीं हूं क्योंकि डिस्क पर मेरी ऑब्जेक्ट्स को क्रमबद्ध करने में सक्षम नहीं है। –

3

यह रूपरेखा के बिना पता करने के लिए मुश्किल है चला जाता है, लेकिन मेरा अनुमान है अपने खराब प्रदर्शन ObjectOutputStream उपयोग करने के लिए नीचे है। क्या आपने अपना खुद का writeObject(ObjectOutputStream) and readObject(ObjectOutputStream) methods लिखने की कोशिश की है क्योंकि इससे प्रदर्शन में मदद मिल सकती है।

आप traceview उपकरण का उपयोग यह देखने के लिए कर सकते हैं कि एप्लिकेशन कहां धीमा चल रहा है। 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; 
} 

और गतिविधि

से फोन कर
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(); 

मैनिफ़ेस्ट फ़ाइल में WRITE_EXTERNAL_STORAGE अनुमतियों का उपयोग करने भूल नहीं है।

संबंधित मुद्दे