2016-10-20 39 views
6

Cel:Przekazanie Rysunek/Malarstwo/Zapisywanie wielu bitmap

chcę zwrócić/zapisu/farby na bitmapy z plików PDF i zapisywać je razem więc mogę wysłać do nich e-mail.

Szczegóły:

mam wiele Pdf pliki zawierające 5-20 stron każdy, teraz jestem wydobycia bitmap z pdfs i ładuje je we fragmentach w ViewPager, gdzie mogę swipe przez nich i napisać/narysować lub cokolwiek Chcę. Aby zapisać/przywrócić bieżący stan bitmapy, używam onSaveInstanceState. W ten sposób jestem w stanie pobrać ostatni etap bitmapy podczas przesuwania w przód iw tył.

coś takiego:

@Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putParcelable("Bitmap", bitmap); 
    } 

Problem:

użytkownik naciśnie przycisk Wyślij email i powinny być w stanie zapisać wszystkie obrazy niezależnie od tego, która strona jest na IE on edytowany od strony 5 do 10 , a teraz on jest na stronie 10 i naciśnij przycisk wysyłania, że ​​powinienem móc pobrać wszystkie edytowane obrazy.

Problem 2:

Jak już zaznaczono liczbę obrazów są o 5-20, Zapisywanie stanu w onSaveInstanceState działa świetnie, ale stale się powiększa pamięć aplikacji w pamięci RAM, a awarie aplikacji na 10 obraz, w którym rozmiar aplikacji przechodzi na 150Mbs.

Konieczne jest również zapisanie obrazu jako paczki w numerze onSaveInstanceState, ponieważ pomaga on w szybszym ładowaniu obrazów, gdy użytkownik przesunie się z powrotem w inne miejsce.

Tak myślałem czy jest jakiś sposób możemy utworzyć własny Bundle klasę, gdzie możemy zapisać obraz na dysku po powiedzieć 5 stron przewijane i czyści pamięć i przeczytać go ponownie z dysku do pamięci, gdy użytkownik przewija się z powrotem? czy to brzmi rozsądnie?

Co próbowałem:

jako bitmapy są ładowane w oddzielnych fragmentów Próbowałam zapisać bitmapy w pamięci zewnętrznej w OnDestroy, ale jak zapisywanie map bitowych do dysku nie jest łatwym zadaniem, trwa Czas jednak używam AsyncTask , ale gdy użytkownik przesuwa się nieco między fragmentami, zapisywanie bitmap w OnDestroy nie wydaje się być wygodnym sposobem.

Oto dlaczego zadaję to pytanie, więc może lepiej rozumiesz sytuację i możesz mi pomóc osiągnąć to w bardziej przekonujący sposób.

Co więc zamierzasz poradzić sobie z tą sytuacją?

Uwaga:

jeśli masz problemy ze zrozumieniem sytuacji i potrzebują więcej informacji zostawić komentarz i będę aktualizować pytanie.

Dzięki

+0

Mam dla ciebie następujące pytania. 1. Czy przeskalujesz obrazy i wyświetlasz je do Viewpagera odpowiednio do szerokości/wysokości układu. jeśli nie, musisz to zrobić (co ograniczy zużycie pamięci bitmapowej). – HourGlass

+0

2. Powiedzmy, że masz płótno nad każdym obrazem, użytkownik maluje coś nad nim, a zachowujesz zmiany w obrazie, gdy użytkownik przesunie do następnego. (Ta praktyka zwiększy rozmiar obrazu). – HourGlass

Odpowiedz

0

Opiszę jak widzę rozwiązanie tego problemu teraz.

Powinno być Service który bierze zmodyfikowanego bitmapę pewnym ID (tak samo dla wszystkich modyfikacji oryginalnej bitmapy), dodaje go w kolejce, a następnie każdy element z tej kolejki, że utrzymuje się w pamięci zewnętrznej. Ma ograniczoną instancję Executor, która wykonuje te zadania (mogą to być tylko Runnable) i Service tworzy, gdzie mapuje zadanie Future do identyfikatora bitmapy. Kiedy nadszedł nowy Bitmap, Service sprawdza mapę i zastępuje zadanie oczekujące (z tą samą oryginalną bitmapą), o ile istnieje.

Możesz wysłać zadanie do tego Service z destroyItem przechwytującego z FragmentStatePagerAdapter.

Tak więc, gdy użytkownik kliknie przycisk Zapisz, należy również wysłać wszystkie edytowane bitmapy pozostawione do tego Service i czekać na zakończenie.

+0

Myślę też o tym, co myślisz o [Tap] (http://square.github.io/tape/)? – Max

+0

@MaxRockwood wygląda dobrze, jak płaskie owinięte wokół usługi android, kwadrat prawie zawsze tworzy dobre rzeczy myśli. Ale nie użyłem go przed – Beloo

+0

tak, system kolejki wydaje się obiecujący w odniesieniu do sytuacji, którą mam, dam mu szansę i opublikuję aktualizację. – Max