2010-08-20 20 views

Odpowiedz

87

Jest to spowodowane tym, że wszystkie zmiany w widokach RemoteView są serializowane (np. SetInt i setImageViewBitmap). Bitmapy są również serializowane do wewnętrznego pakietu. Niestety ten pakiet ma bardzo mały rozmiar.

Można go rozwiązać poprzez skalowanie w dół rozmiar obrazu w ten sposób:

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

Wybierz newHeight być na tyle małe (~ 100 za każdy kwadrat powinien wziąć na ekranie) i używać go do widgetu a twój problem zostanie rozwiązany :)

+1

Nie bardzo rozumiem, co się tutaj dzieje. Używam ViewPagera z dość dużym zbiorem danych, ale pamięta on wszystko między stronami mimo spamu związanego z segregatorem. Czy pakiet jest zapisywany w pamięci lokalnej, a następnie zapisywany wstępnie lub co? Czy mogę utracić dane, jeśli dodaję więcej stron? –

+1

Świetna pomoc. bardzo ci dziękuję !!!! – Jigar

+5

Ale to zredukuje jakość obrazu –

35

Bufor transakcji Binder ma ograniczony stały rozmiar, obecnie 1Mb, który jest wspólny dla wszystkich transakcji w toku dla procesu. W związku z tym wyjątek ten może zostać zgłoszony w przypadku wielu transakcji w toku, nawet jeśli większość pojedynczych transakcji ma umiarkowany rozmiar.

odnoszą ten link

8

Mam rozwiązać ten problem przez przechowywania zdjęć w pamięci wewnętrznej, a następnie za pomocą .setImageURI() zamiast .setBitmap().

+1

i nie przesyłaj obrazów przez Parcelable z ekranu na ekran, tak czy inaczej, to chyba najgorsze w tym przypadku. – MartinC

61

Można skompresować bitmapę jako tablicę bajtów, a następnie rozpakować ją w innej czynności, na przykład.

Kompresuj !!

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

Rozpakuj !!

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

Doskonały, to znacznie zmniejsza rozmiar bitmapy. – Navin

+1

dlaczego nie używać JPEG zamiast PNG? czy nie jest lepiej skompresowany? – mehmet6parmak

+2

@ mehmet6parmak PNG jest używany, ponieważ jest bezstratny, w przeciwieństwie do JPEG. Tak, JPEG kompresuje się lepiej, ale jakość (nieco) cierpi w rezultacie. – Petzku

3

Właściwym podejściem jest użycie setImageViewUri() (wolniej) lub setImageViewBitmap() i ponowne RemoteView s za każdym razem dokonać aktualizacji zgłoszenia.

12

Zobacz moją odpowiedź w wątku this .

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

Przekraczasz spoiwa bufor transakcji przez przesyłanie dużych element (y) z jednego działania na inne działania.

+0

Miałem ten sam problem Po prostu usunąłem problem putExtra posortowany! – Ivor

Powiązane problemy