Estrutura básica
Vamos primeiro analisar o código mais básico e analisar como esse código é implementado no RXJava.
Obsertable.Onsubscribe <string> ONSUBSCRIBE1 = new Observable.OnsubScribe <String> () {@Override public void Call (assinante <? Super String> assinante) {subscriter.onnext ("1"); assinante.onCompleted (); }}; Assinante <string> assinante1 = novo assinante <string> () {@Override public void oncompleted () {} @Override public void onError (throwable e) {} @Override public void onNext (string s) {}};Primeiro, vamos dar uma olhada no código de observável.create
public final static <t> observável <t> create (onSubScribe <t> f) {retorna novo observável <T> (Hook.OnCreate (f));} Observável protegido (OnsubScribe <T> f) {this.OnsubScribe = f;} Ele chama diretamente o construtor do observável para criar um novo objeto observável. Marcamos temporariamente esse objeto como observável1 para a rastreabilidade posterior.
Ao mesmo tempo, o objeto ONSubscribe que passamos será salvo na propriedade OnSubscribe do Observable1. Esta propriedade é muito importante no contexto subsequente, preste atenção.
Em seguida, vamos dar uma olhada no método de assinatura.
Assinatura final da assinatura final (assinante <? Super T> assinante) {return observable.subscribe (assinante, este);} estática privada <t> assinatura assinatura (assinante <? super t> assinante, observável <t> observável) {... assinante.onstart (); Hook.OnsubScrinceStart (observável, observável.Onsubscribe) .Call (assinante); Return Hook.OnsubScrinceReTurn (assinante);} Como você pode ver, após se inscrever, o método observável1.Onsubscribe.Call é chamado diretamente, que é o método de chamada do objeto OnsubScribe1 em nosso código. Os parâmetros passados são o objeto Assinante1 definido em nosso código. O que é feito no método de chamada é chamar os métodos OnNext e OncomPlete do objeto Subscrinter1 recebido.
Isso permite a comunicação entre o observador e o observador. Não é muito simples?
Public Void Call (assinante <? Super String> Assinante) {subscriter.onnext ("1"); assinante.oncompleted ();}Resumo do cenário de uso rxjava
1. Verifique o cenário em cache primeiro
Obtenha dados, verifique se há um cache na memória e verifique se há alguma condição anterior no cache do arquivo e, finalmente, a seguinte condição será satisfeita na rede.
Final Observable <String> memória = observável.create (new observable.Onsubscribe <string> () {@Override public void Call (assinante <? Super String> subscriter) {if (memóriaCache! Observable.onsubscribe <strocre> () {@Override public void Call (assinante <? Super String> assinante) {String CachePref = rxPreferences.getString ("cache"). }}); Obsertable <string> rede = observável.Just ("Rede"); // O principal é confiar no operador concat para implementar o observável.Concat (memória, disco, rede) .First (). Subscribeon (Schedulers.NewThread ().2. A interface precisa esperar até que várias interfaces coletem dados simultaneamente antes de atualizar
// dividiu a saída de dois observáveis e a ordem não é garantida. Envie ao assinante na ordem dos eventos private void testMerge () {observable <string> obsertable1 = DemOtils.CreateObservable1 (). Subscribeon (schedulers.newThread ()); Observável <string> obsertable2 = DemOtils.CreateObservable2 (). Subscribeon (schedulers.newthread ()); Obsertable.Merge (observável1, obsertable2) .SubScribeon (schedulers.newthread ()) .subscribe (System.out :: println);}3. A solicitação de uma interface depende dos dados retornados por outra solicitação da API.
Por exemplo, depois de precisarmos efetuar login, geralmente obtemos a lista de mensagens com base no token que obtemos.
Aqui, o rxjava é usado para resolver o problema dos retornos de chamada aninhados. Há um substantivo adequado chamado retorno de chamada inferno
NetworkService.getToken ("Nome de usuário", "Senha") .flatmap (S -> NetworkService.getMessage (S)) .SubScribe (S -> {System.out.println ("Mensagem:" + S);});4. O botão de interface precisa evitar cliques contínuos
Rxview.Clicks (FindViewById (r.id.btn_throttle)) .throttlefirst (1, timeUnit.Seconds) .Subscribe (evite -> {System.out.println ("Click");});5. Interface responsiva
Por exemplo, a caixa de seleção é verificada e a preferência correspondente é atualizada automaticamente.
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);Preference<Boolean> checked = rxPreferences.getBoolean("checked", true);CheckBox checkBox = (CheckBox) FindViewById (r.id.cb_test); rxcompoundbutton.checkedChanges (caixa de seleção) .subscribe (checked.asaction ());6. Transformação complexa de dados
Obsertable.Just ("1", "2", "2", "3", "4", "5") .Map (Inteiro :: parseint) .Filter (S -> S> 1) .Distinct () .Take (3). Reduce ((Inteiro, integger2) -> integro () + Integer2. .SubScribe (System.out :: println); // 9