2013-02-12 7 views
8

Rozszerzam wtyczkę Messenger o funkcjonalność, która pozwoli przekazywać wiadomości w głównym wątku zamiast wszystkiego, co dzieje się w wątku tła.MvvmCross: Używanie InvokeOnMainThread w wtyczce

Rozszerzyłem BaseSubscription o bool, wiedząc, że subskrypcja musi zostać wysłana w głównym wątku. Teraz potrzebuję móc używać InvokeOnMainThread z metod TypedInvoke w rzeczywistych implementacjach subskrypcji.

Kiedy patrzę w odnośnym zestawie MvvmCross, widzę, że Cirrious.MvvmCross.ViewModels.MvxMainThreadDispatchingObject zawiera metodę , więc pytanie brzmi, w jaki sposób uzyskać ten obiekt, aby móc wywołać metodę?

Odpowiedz

5

Najłatwiej zdobyć wątku UI jest dziedziczą MvxMainThreadDispatchingObject

Jeśli hierarchia nie pozwolę wam, potem następny Najprostszym sposobem jest dodanie interfejsu markera IMvxServiceConsumer a następnie użyć GetService<T> metoda rozszerzenie:

public class MyClass 
    : MyBaseClass 
    , IMvxServiceConsumer 
{ 
    // ... 

    private bool DoStuff(Action stuff) 
    { 
     var dispatcherProvider = this.GetService<IMvxMainThreadDispatcherProvider>(); 
     var dispatcher = dispatcherProvider.Dispatcher; 
     if (dispatcher == null) { 
      return false; 
     } 

     return dispatcher.RequestMainThreadAction(action); 
    } 
} 

GetService<T>() metoda statyczna może być także wywołana jako metoda statyczna, jeśli preferowane (jeśli nie chcesz używać IMvxServiceConsumer).


Uwagi:

  • jeśli dzielenie kodu między „Aplikacje” i „Usługi”/„BackgroundAgents” trzeba być bardzo ostrożnym, aby sprawdzić, czy nie wystąpiły błędy - nie zawsze jest dostępny wątek interfejsu użytkownika.

  • Android jest szczególnie specjalne - wątek UI można naprawdę tylko dostępne za pośrednictwem bieżącej działalności planie - obecnie MvvmCross tory (poprzez aktywny onStart i OnResume haki) w służbie IMvxAndroidCurrentTopActivity - ale nie ma gwarancji, że zawsze będziesz miał działanie na pierwszym planie - np jeśli twój kod kiedykolwiek ładuje działania inne niż MvvmCross, to oczywiście MvvmCross nie będzie o tym wiedział.

  • Nie należy trzymać się odniesieniami do dyspozytora - jeśli nie, to może być posiadających aktywny Android w pamięci poza ich naturalnym wcieleń

  • Chyba DoStuff mogłyby zostać wprowadzone do metody wydłużania też - może dodam, że w v3 (https://github.com/slodge/MvvmCross/issues/150)

+0

Czy to wciąż aktualne? – tofutim

+1

Dziedziczenie z MvxMainThreadDispatchingObject działało dla mnie (w iOS jednej z moich wtyczek MvvmCross). –

+0

Czy możesz podać przykład wywołania funkcji DoStuff? Na przykład, aby wyświetlić sekwencję ładowania. Dzięki. – Ph0b0x