विजेट में बिटमैप को गतिशील रूप से डालने पर असफल लेन-देन


116

क्या कोई मुझे असफल बाइंडर लेनदेन त्रुटि का कारण बता सकता है ? मैं इस त्रुटि संदेश को logcat में देख सकता हूं। एक विजेट में एक बिटमैप को डालने की कोशिश करते हुए मुझे यह त्रुटि हो रही है ...

जवाबों:


91

ऐसा इसलिए होता है क्योंकि RemoteViews में सभी परिवर्तन क्रमबद्ध होते हैं (जैसे setInt और setImageViewBitmap)। बिटमैप भी एक आंतरिक बंडल में क्रमबद्ध हैं। दुर्भाग्य से इस बंडल में बहुत छोटे आकार की सीमा है।

आप इसे इस तरह से छवि के आकार को छोटा करके हल कर सकते हैं:

 public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) {

 final float densityMultiplier = context.getResources().getDisplayMetrics().density;        

 int h= (int) (newHeight*densityMultiplier);
 int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));

 photo=Bitmap.createScaledBitmap(photo, w, h, true);

 return photo;
 }

नया होने के लिए पर्याप्त छोटा चुनें (स्क्रीन पर इसे लेने के लिए हर वर्ग के लिए ~ 100) और इसे अपने विजेट के लिए उपयोग करें, और आपकी समस्या हल हो जाएगी :)


1
जो कुछ मुझे समझ में नहीं आता है वही यहाँ होता है। मैं काफी बड़े डेटासेट के साथ एक ViewPager का उपयोग कर रहा हूं, फिर भी यह बाइंडर त्रुटि स्पैम के बावजूद पृष्ठों के बीच सब कुछ याद रखता है। क्या बंडल स्थानीय भंडारण को लिखा जाता है और फिर प्रीफ़ेट किया जाता है या क्या? यदि मैं अधिक पृष्ठ जोड़ता हूं तो क्या मैं संभवतः डेटा खो सकता हूं?
G_V

7
लेकिन यह छवि गुणवत्ता को कम कर देगा
जॉन जो

64

आप बिटमैप को बाइट के ऐरे के रूप में संपीड़ित कर सकते हैं और फिर इसे इस तरह से किसी अन्य गतिविधि में जोड़ सकते हैं।

संकुचित करें!!

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] bytes = stream.toByteArray(); 
        setresult.putExtra("BMP",bytes);

Uncompress !!

        byte[] bytes = data.getByteArrayExtra("BMP");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

1
बिल्कुल सही, यह बिटमैप आकार को काफी कम कर देता है।
नविन

1
PNG के बजाय JPEG का उपयोग क्यों नहीं किया जाता है? यह बेहतर संकुचित नहीं है?
mehmet6parmak

3
@ mehmet6parmak PNG का उपयोग किया जाता है क्योंकि यह जेपीईजी के विपरीत दोषरहित है। हां, जेपीईजी बेहतर संपीड़ित करता है, लेकिन गुणवत्ता (कुछ हद तक) एक परिणाम के रूप में ग्रस्त है।
पेट्ज़कू

मेरे लिए काम नहीं करता है :( stackoverflow.com/questions/34540819/…
जॉन जो

कुडोस! एक अस्थायी कार्यान्वयन के लिए महान वर्कअराउंड मैं पर काम कर रहा था। हालांकि बंडलों / इरादों का उपयोग करते समय भारी डेटा पास करने से बचना चाहिए।
सूद 28००

37

बाइंडर लेनदेन बफर का एक सीमित निश्चित आकार है, वर्तमान में 1Mb, जो प्रक्रिया के लिए प्रगति में सभी लेनदेन द्वारा साझा किया गया है। नतीजतन, इस अपवाद को तब फेंका जा सकता है जब कई लेन-देन प्रगति पर होते हैं, जबकि अधिकांश व्यक्तिगत लेनदेन मध्यम आकार के होते हैं।

इस लिंक को देखें


12

इस सूत्र में मेरा उत्तर देखें ।

intent.putExtra("Some string",very_large_obj_for_binder_buffer);

आप बड़े तत्व (ओं) को एक गतिविधि से दूसरी गतिविधि में स्थानांतरित करके बाइंडर लेनदेन बफर को पार कर रहे हैं।


मैं एक ही मुद्दा था मैं सिर्फ putExtra समस्या को हटा दिया!
Ivor

8

मैंने आंतरिक संग्रहण पर चित्र संग्रहीत करके और फिर .setBitmapI () के बजाय .setImageURI () का उपयोग करके इस समस्या को हल किया है।


1
और स्क्रीन से स्क्रीन पर पार्सलबल के माध्यम से छवियों को पास न करें, इसलिए मुझे लगता है कि इस मामले में सबसे खराब है
मार्टिन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.