यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।
प्रदर्शन और बड़ी सूचियाँ
बहुत सारे डेटा या भारी ड्रॉइंग के साथ 60 fps कैसे बनाए रखें — निम्न-श्रेणी के GPU पर भी। “क्यों” (एकल paint thread, माँग पर रेंडर) paint thread और रेंडरिंग पाइपलाइन में है।
वर्चुअलाइज़ करें: VirtualListView, न कि ListView
ListView सभी आइटम को मेमोरी में रखता है। सैकड़ों/हज़ारों के लिए, VirtualListView का उपयोग करें — यह
views को रीसाइकल करता है (केवल दृश्यमान को रेंडर करता है)। adapter बनाने (एक बार, रीसाइकल) को
बाइंड करने (सस्ता, बहुत चलता है) से अलग करता है:
VirtualListView lista = new VirtualListView(Relative.ofFont(3f), new DataAdapter() {
public int getCount() { return dados.size(); }
public Component createView() throws Exception { // कुछ ही बार बनाया गया (pool)
return new Label("");
}
public void bindView(Component v, int i) throws Exception { // scroll में बहुत चलता है → सस्ता और idempotent
((Label) v).setText(dados.get(i).nome);
}
});
// डेटा बदलने पर:
lista.notifyDataChanged();
bindViewसस्ता और idempotent होना चाहिए — यह स्क्रॉल में हर रीसाइकल पर चलता है। वहाँ कोई I/O, आवंटन या महँगी गणना नहीं।
रीसाइकल क्यों: वास्तविक लागत createView() है। रीसाइकल करने पर, मेमोरी getCount() से स्वतंत्र रूप से
स्थिर रहती है — 10 या 10,000 आइटम उतने ही मुट्ठी भर views का उपयोग करते हैं।
रिमोट पेजिनेशन: PagedDataAdapter
पेज द्वारा आने वाले डेटा (नेटवर्क) के लिए, PagedDataAdapter का उपयोग करें (आंतरिक LRU कैश):
var adapter = new PagedDataAdapter(50, 4) { // 50 आइटम/पृष्ठ, cache में 4 पृष्ठ
public int getTotalCount() { return total; }
public void loadPage(int page, PageCallback cb) {
new Thread(() -> {
Object[] itens = api.buscarPagina(page, pageSize); // paint thread के बाहर
Component.onUI(() -> cb.onPageLoaded(page, itens)); // UI पर वापस
}).start();
}
public Component createView() throws Exception { return new Label(""); }
public void bindItem(Component v, Object item, int i) throws Exception {
((Label) v).setText(((Cliente) item).nome);
}
};
ड्रॉइंग: सस्ता onPaint और माँग पर रेंडर
- प्रति फ़्रेम पुनः-पेंट न करें।
repaint()को केवल तब कॉल करें जब स्थिति बदलती है — स्क्रीन खुद पुनः-ड्रॉ नहीं करती (माँग पर रेंडर)। onPaintमें आवंटन न करें। यह पूरे पेड़ के लिए हर फ़्रेम पर चलता है; वस्तुओं (GRect,Font) को फ़ील्ड में पुनः-उपयोग करें, प्रति फ़्रेम न बनाएँ।- कभी भी paint thread को अवरुद्ध न करें — डेटाबेस/नेटवर्क I/O वर्कर थ्रेड में +
onUI।
अच्छी प्रथाएँ
- ~सैकड़ों आइटम से
VirtualListView;ListViewकेवल छोटी/निश्चित सूचियों के लिए। bindView/bindItemको दुबला रखें; छवियों/डेटा को बाहर लोड करें और तैयार को बाइंड करें।- बड़ी छवियाँ: प्रति फ़्रेम स्केल करने के बजाय एक बार आकार बदलें (विनाशकारी स्केल)।
आम गलतियाँ
- हज़ारों आइटम के साथ
ListView(मेमोरी उड़ाता है / फ्रीज़ करता है)। bindViewजो I/O करता है या आवंटित करता है (स्क्रॉल को अटकाता है)।- माँग पर के बजाय लूप/प्रति फ़्रेम पुनः-पेंट करना।