2012-02-16 24 views
12

Używam Fragments and LoaderManager. Muszę uruchomić nieznaną liczbę zadań i mogą one być uruchomione równolegle (w przeciwnym razie ponownie użyłbym jednego i tylko jednego programu ładującego). Na przykład, mam widok listy, a każdy wiersz może mieć przycisk, aby zapisać zawartość tego wiersza na serwerze internetowym. Użytkownik może równolegle inicjować żądanie składowania wielu elementów.Wzór dla wielu programów ładujących za pomocą programu LoaderManager?

private int nextId = 0; 

private void onClickListener() { 
    Bundle bundle = new Bundle(); 
    bundle.putNextData(...); 
    getLoaderManager().initLoader(nextId++, bundle, this); 
} 

mógłbym spróbować księgowych siebie, więc utworzyć pulę ładowarki ręcznie i ponownie je, jeśli to możliwe, wydaje się, że to może być coś już wdrożone przez API?

Dzięki

+1

Ładne pytanie. Udało ci się go rozwiązać? Myślę, że powinieneś w jakiś sposób umieścić w kolejce swoje zadania. –

Odpowiedz

4

Nie sądzę, należy użyć ładowarki do zapisywania danych na zdalnym serwerze.

Zamiast tego należy użyć IntentService lub czegoś podobnego, aby przetworzyć kolejkę operacji "składowania". W ten sposób twoja komunikacja z serwerem sieciowym może być grupowana, zwinięta (tzn. Wiele zapisanych w kolejce zapisów dla pojedynczego elementu może zostać zwinięta w jedną operację) i jeśli to konieczne, będzie działać dłużej niż długość życia.

zapisać kolejkę przetwarzane przez IntentService (lub odpowiednik) jest również świetny sposób, aby ponowić próbę nieudane operacje z backoff, ponieważ można realizować opóźnione ponownych prób z użyciem wykładniczy backoff AlarmManager.

+0

A co jeśli mam kategorie "n" w bazie danych i chciałbym je załadować za pomocą 'CursorLoader'. Jakiego identyfikatora powinienem użyć? – pixel

+1

Możesz oczywiście używać dowolnych identyfikatorów i prawdopodobnie tylko liczb całkowitych 1.n, jeśli kategorie są statyczne. Jeśli najpierw ładujesz listę kategorii, a następnie szczegóły dotyczące każdej kategorii, prawdopodobnie musisz zoptymalizować zapytanie. Ale zakładając, że nie masz innej opcji, powinieneś używać identyfikatorów stabilnych jako identyfikatorów programu ładującego, a nie np. pozycje kursora. –

1

Usługa IntentService lub usługa związana są zawsze dobrym podejściem. Jako punkty rzymskie, zwróć uwagę, że wielokrotne wczytywanie kilku żądań i wywoływanie ich osobno nie jest zalecane (jest bardzo prawdopodobne, że dasz dużo pracy na połączeniu radiowym - podczas korzystania z danych - które między innymi wyczerpią baterię. Oto must-read o tym)

Osobiście polecam używanie usługi powiązanej z kolejką żądań i pulą dostępnych wątków (to podejście daje pełną kontrolę nad bardziej złożonymi operacjami sieciowymi, jak w twoim przypadku). Więcej szczegółów na temat podejścia here i przykładu pracy na próbę nad here.

Zaktualizuj nas o swoich postępach.

0

Jesteś we właściwym kierunku, pozwól mi tylko trochę pomóc.

Ponowne to rzeczywiście dobry pomysł, i nie trzeba się martwić o to, ponieważ Android zrobił to za ciebie (lub Java rzeczywiście;)

Nazywa ThreadPoolExecuter, można uruchomić dowolną liczbę zadań jak chcesz i Otworzy on tylko wstępnie zdefiniowaną liczbę wątków (najlepsza praktyka próbuje otworzyć tyle wątków, ile równoległe połączenie sieciowe może być uruchomione na urządzeniu, z moich badań wynosi od 4 do 9).

Jeśli próbujesz pobrać ten sam adres URL dwa razy, możesz zabezpieczyć się i otworzyć tylko jedno zadanie.

Powiązane problemy