मुझे एक स्मृति समस्या है जिसे मैं समझ नहीं सकता। मेरे पास एक वर्ग है जो मेरे सभी डेटाबेस को पुनर्प्राप्त करने का काम करता है। त्रुटि मेरे पास है वह इस प्रकार है:कर्सर आवंटित करते समय मेमोरी से बाहर
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)
स्मृति आवंटन त्रुटि तब होती है जब मैं ऐसा करते हैं:
mDatabaseInterface.getGraphForLevel(level);
मैं जानता हूँ कि यह एक रिसाव है क्योंकि मैं मोटे तौर पर इस विधि हर 2.5 सेकंड कहते हैं, और 5 या 6 पहली कॉल आसानी से गुजरती हैं। अब यहाँ मेरी DatabaseInterface कक्षा में तरीके हैं:
public Graph getGraphForLevel(Level level) {
//get the nodes
ArrayList<Node> nodes = new ArrayList<Node>(Arrays.asList(this.getNodesWithLevel(level)));
//get the edges
ArrayList<Edge> edges = new ArrayList<Edge>(Arrays.asList(this.getEdgesWithNodes(nodes)));
return new Graph(nodes, edges);
}
public Node[] getNodesWithLevel(Level level) {
List<Node> l = new ArrayList<Node>();
Cursor cursor = mDatabase.query("nodes", null,
"level = " + wrapSql(String.valueOf(level.getId())), null, null, null, null);
while (cursor.moveToNext()) {
l.add(parseNodeFromCursor(cursor));
}
cursor.close();
return l.toArray(new Node[l.size()]);
}
private Node parseNodeFromCursor(Cursor cursor) {
Level l = getLevelWithId(cursor.getInt(2));
return new Node(cursor.getInt(0), cursor.getString(1), l,
cursor.getInt(4), cursor.getInt(5));
}
मैं तरीकों कि एक दूसरे को फोन का एक बहुत है, लेकिन मैं जानता हूँ कि यह एक प्रत्यावर्तन समस्या है क्योंकि इस वर्ग के किसी अन्य ऐप्स में काम करता है नहीं है। मेरा मुख्य सवाल यह है कि कर्सर को मुक्त क्यों नहीं करता है? अगर मैं कुछ ऐसा करता हूं:
cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();
कर्सर उस मामले में बनाए रखा है?
अग्रिम धन्यवाद।
बस एक विचार पाने के लिए, नोड्स और किनारों के लिए टेबल कितने बड़े हैं? – Matthieu
वे अब बहुत छोटे हैं, 20 पंक्तियों और 10 कॉलम अधिकांश – chopchop