একটি উইজেটে গতিশীলভাবে একটি বিটম্যাপ লাগানোর সময় বাইন্ডার লেনদেন ব্যর্থ


116

বাইন্ডার লেনদেনের ব্যর্থতার ব্যর্থতার কারণ আমাকে কেউ বলতে পারেন ? আমি লগকটে এই ত্রুটি বার্তাটি দেখতে পাচ্ছি। উইজেটে গতিশীলভাবে বিটম্যাপ লাগানোর চেষ্টা করার সময় আমি এই ত্রুটিটি পাচ্ছি ...

উত্তর:


91

রিমোটভিউজে সমস্ত পরিবর্তন সিরিয়ালাইজড হওয়ার কারণে এটি ঘটে (যেমন 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
আমি যা বুঝতে পারি না তা হ'ল এখানে কী ঘটে। আমি একটি বেশ বড় ডেটাসেট সহ একটি ভিউপেজার ব্যবহার করছি, তবে এটি বাইন্ডার ত্রুটিযুক্ত স্প্যাম সত্ত্বেও পৃষ্ঠাগুলির মধ্যে সমস্ত কিছু মনে রাখে না। লোকাল স্টোরেজে বান্ডেলটি কি লিখে যায় এবং তারপরে প্রিফেট করা হয় বা কী? আমি আরও পৃষ্ঠা যুক্ত করলে আমি কী ডেটা হারাতে পারি?
G_V

7
তবে এটি চিত্রের মান হ্রাস করবে
জন জো

64

আপনি একটি বাইটের অ্যারে হিসাবে বিটম্যাপটি সংকুচিত করতে পারেন এবং তারপরে এটিকে অন্য ক্রিয়াকলাপে সঙ্কুচিত করতে পারেন।

কম্প্রেস !!

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

কমপ্রেস !!

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

1
নিখুঁত, এটি বিটম্যাপ আকারে উল্লেখযোগ্যভাবে হ্রাস করে।
নবীন

1
কেন পিএনজির পরিবর্তে জেপিইজি ব্যবহার করবেন না? এটি আরও সংকুচিত না?
mehmet6parmak

3
@ মেহমেট p পারমাক পিএনজি ব্যবহার করা হয় কারণ এটি জেপিজি থেকে পৃথক, ক্ষতিহীন। হ্যাঁ, জেপিইজি আরও ভালভাবে সংকোচিত হয়, তবে ফলাফলটি মানের (কিছুটা) ভুগছে।
পেটজকু

আমার জন্য কাজ করে না :( স্ট্যাকওভারফ্লো.com
জন জো

যশ! আমি যে অস্থায়ী বাস্তবায়নের জন্য কাজ করছি তার জন্য দুর্দান্ত কাজ। যদিও বান্ডিলস / ইন্টেন্টগুলি ব্যবহার করার সময় ভারী ডেটা পাস করা এড়ানো উচিত।
Sud007

37

বাইন্ডার লেনদেন বাফারের একটি সীমিত স্থির আকার রয়েছে, বর্তমানে 1 এমবি, যা প্রক্রিয়াটির জন্য সমস্ত লেনদেনের দ্বারা ভাগ করা হয়। ফলস্বরূপ যখন ব্যক্তিগত লেনদেনের বেশিরভাগ মাঝারি আকারের হয় তখনও অনেকগুলি লেনদেন চলতে থাকলে এই ব্যতিক্রম ছোঁড়া যায়।

এই লিঙ্কটি উল্লেখ করুন


12

আমার উত্তরটি এই থ্রেডে দেখুন।

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

আপনি একটি ক্রিয়াকলাপ থেকে অন্য ক্রিয়াকলাপে বৃহত উপাদান (গুলি) স্থানান্তর করে বাইন্ডার লেনদেন বাফারকে ছাড়িয়ে যাচ্ছেন।


আমার একই সমস্যা ছিল আমি কেবল পুটেক্সট্রা সমস্যাটি বাছাই করেছি!
আইভর

8

আমি অভ্যন্তরীণ স্টোরেজে চিত্রগুলি সঞ্চয় করে এবং তারপর .setBitmap () এর পরিবর্তে .setImageURI () ব্যবহার করে এই সমস্যাটি সমাধান করেছি।


1
এবং স্ক্রিন থেকে স্ক্রিনে পার্সেবলের মাধ্যমে চিত্রগুলি পাস করবেন না, আমার ধারণা এই ক্ষেত্রে এটি সবচেয়ে খারাপ
মার্টিনসি

3

সঠিক পন্থা ব্যবহার করা setImageViewUri()(ধীর) অথবা setImageViewBitmap()এবং পুনরায় RemoteViewগুলি প্রত্যেক সময় আপনি বিজ্ঞপ্তি আপডেট করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.