मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें

यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।

प्रदर्शन और बड़ी सूचियाँ

बहुत सारे डेटा या भारी ड्रॉइंग के साथ 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 करता है या आवंटित करता है (स्क्रॉल को अटकाता है)।
  • माँग पर के बजाय लूप/प्रति फ़्रेम पुनः-पेंट करना।

यह भी देखें

क्या यह पृष्ठ उपयोगी था?