मैंने लीनबैक का उपयोग करके एंड्रॉइड टीवी के लिए एक ऐप बनाया है, मैं ब्राउज़ सपोर्ट फ्रैगमेंट का उपयोग कर रहा हूं और मेरे आइटम क्लास कार्डप्रेजेंटर द्वारा प्रस्तुत किए जाते हैं जो प्रस्तुतकर्ता वर्ग को लागू करता है। मैं आइकन के लिए onBindViewHolder विधि में चित्र लोड कर रहा हूं। लेकिन इसकी मेमोरी में बहुत सारी छवियां लोड हो रही हैं, मैंने लॉगकैट द्वारा जांच की है कि लोड की गई कुल छवियां बहुत अधिक हैं (मूल रूप से लगभग 54 पंक्तियां लोड होती हैं और प्रत्येक पंक्ति में 10-12 कार्ड होते हैं)। इससे एप्लिकेशन में जीसी रुक रहा है। मैं जो चाहता हूं वह केवल दृश्यमान छवियों को लोड करना है। प्रस्तुतकर्ता वर्ग से onViewAttachedToWindow विधि का उपयोग करने का प्रयास किया, लेकिन विधि onBindViewHolder और onViewAttachedToWindow को समान संख्या में कहा जाता है। मैं क्या करना चाहता हूं छवियों को आलसी लोड करना, जब सूचियों को स्क्रॉल किया जाता है, बहुत कुछ खोजने की कोशिश की लेकिन उचित उत्तर नहीं मिला, क्या कोई मेरी मदद कर सकता है?

0
Shariq 14 अप्रैल 2020, 14:34

1 उत्तर

सबसे बढ़िया उत्तर

छवि लोडिंग को ट्रिगर करने के लिए onBindViewHolder सही जगह है। जब आपका लेआउट फुलाया जाता है, तो आपको सभी दृश्यमान वस्तुओं के लिए onBindViewHolder को कॉल करना चाहिए, कभी-कभी कटऑफ के आधार पर अगले आइटम के लिए बफर के साथ। यदि आप जो देख रहे हैं वह onBindViewHolder को समझ से अधिक बार कहा जा रहा है (उदाहरण के लिए, आप स्क्रीन पर 20 आइटम देखते हैं लेकिन इसे 100 बार कहा जाता है), तो आपको यह सुनिश्चित करना चाहिए कि आपके लेआउट का एक सेट आकार है।

उदाहरण के लिए, यदि आप कार्ड प्रदर्शित कर रहे हैं और छवि लोड होने के बाद तक कार्ड की चौड़ाई सेट नहीं है, तो आपकी चौड़ाई प्रभावी रूप से 0 हो सकती है, इसलिए उस पंक्ति में प्रत्येक कार्ड बाध्य है, आपके छवि अनुरोधों को ट्रिगर करता है। ImageCardView में LayoutParams सेट करने के लिए setMainImageDimensions सहायक विधि है, इसलिए आप इसे या तो onCreateViewHolder (यदि आकार सभी वस्तुओं के लिए समान है) या onBindViewHolder (यदि आकार आइटम पर निर्भर करता है) में कॉल कर सकते हैं।

1
Ian G. Clifton 15 अप्रैल 2020, 18:42