Bir bitmap'i bir widget'a dinamik olarak yerleştirirken başarısız ciltleme işlemi


116

Kimse bana başarısız cilt işlemi hatasının nedenini söyleyebilir mi? Bu hata mesajını logcat'te görebiliyorum. Bir bitmap'i bir widget'a dinamik olarak yerleştirmeye çalışırken bu hatayı alıyorum ...

Yanıtlar:


91

Bunun nedeni, RemoteViews'taki tüm değişikliklerin serileştirilmesidir (örn. SetInt ve setImageViewBitmap). Bitmapler ayrıca dahili bir paket halinde serileştirilir. Maalesef bu paketin çok küçük bir boyut sınırı var.

Görüntü boyutunu şu şekilde küçülterek çözebilirsiniz:

 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;
 }

Yeterince küçük olması için newHeight'ı seçin (ekranda alması gereken her kare için ~ 100) ve widget'ınız için kullanın, probleminiz çözülecektir :)


1
Tam olarak anlamadığım şey, burada tam olarak ne olduğu. Oldukça büyük bir veri kümesine sahip bir ViewPager kullanıyorum, ancak ciltçi hatası spam'e rağmen sayfalar arasındaki her şeyi hatırlıyor. Paket yerel depolamaya yazılıyor mu ve ardından önceden getiriliyor mu? Daha fazla sayfa eklersem verileri kaybedebilir miyim?
G_V

7
Ancak bu, görüntü kalitesini düşürecek
John Joe

64

Bit eşlemi bir bayt dizisi olarak sıkıştırabilir ve ardından bunun gibi başka bir etkinlikte açabilirsiniz.

Kompres!!

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

Sıkıştırmasını !!

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

1
Mükemmel, bu, bitmap boyutunu önemli ölçüde azaltır.
Navin

1
neden PNG yerine JPEG kullanmıyorsunuz? daha iyi sıkıştırılmamış mı?
mehmet6parmak

3
@ mehmet6parmak PNG, JPEG'den farklı olarak kayıpsız olduğu için kullanılır. Evet, JPEG daha iyi sıkıştırır, ancak sonuç olarak kalite (bir şekilde) düşer.
Petzku

benim için çalışmıyor :( stackoverflow.com/questions/34540819/…
John Joe

Kudos! Üzerinde çalıştığım geçici bir uygulama için harika bir çözüm. Paketler / Amaçlar kullanılırken ağır verilerin aktarılmasından kaçınılmalıdır.
sud007

37

Binder işlem tamponu, işlem için devam eden tüm işlemler tarafından paylaşılan şu anda 1Mb olan sınırlı bir sabit boyuta sahiptir. Sonuç olarak, münferit işlemlerin çoğu orta büyüklükte olsa bile devam eden birçok işlem olduğunda bu istisna atılabilir.

bu bağlantıya bakın


12

Cevabımı bu başlıkta görün.

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

Büyük öğeleri bir etkinlikten diğerine aktararak bağlayıcı işlem arabelleğini aşıyorsunuz.


Aynı sorunu yaşadım, sadece sıralanan putExtra problemini kaldırdım!
Ivor

8

Bu sorunu, görüntüleri dahili depolamada depolayarak ve ardından .setBitmap () yerine .setImageURI () kullanarak çözdüm.


1
ve görüntüleri Parcelable'dan ekrandan ekrana geçirmeyin, sanırım bu durumda en kötüsü bu
MartinC

3

Doğru yaklaşım, bildirimi her güncellediğinizde s kullanmak setImageViewUri()(daha yavaş) veya setImageViewBitmap()ve yeniden oluşturmaktır RemoteView.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.