Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

172
Visualizações
¿Cuál es la diferencia entre RxJava 2 cancelable y desechable?

Quiero crear un Observable desde el oyente de clics de vista usando RxJava 2. Comencé desde la implementación más simple (no uso lambdas aquí para mostrarle diferentes tipos en este método):

 Observable<View> viewObservable = Observable.create(new ObservableOnSubscribe<View>() { @Override public void subscribe(@NonNull ObservableEmitter<View> e) throws Exception { mNewWordView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View value) { if (!e.isDisposed()) { e.onNext(value); } } }); } });

Luego pensé en la forma de establecer onClickListener en nulo si no se necesita más. Descubrí que hay dos métodos con nombres similares (en cuanto a mí):

e.setCancellable(Cancellable c); y e.setDisposable(Disposable d);

¿Cuál es la diferencia entre ellos y cuál debo usar?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Del Javadoc :

[ Cancellable es] Una interfaz funcional que tiene un único método de cancelación que puede lanzar.

Disposable no es una interfaz funcional y, además, cuando implementa su método dispose() , no se le permite generar excepciones marcadas.

Por el contrario, muchos componentes que no son RxJava devuelven un Closeable o AutoCloseable que se definen a través de throws IOException y throws Exception y son un poco una carga porque necesitarías intentar atraparlo.

Por ejemplo, querrá usar setCancellable cuando trabaje con un archivo:

 Observable.create((ObservableEmitter<byte[]> e) -> { FileInputStream fin = new FileInputStream("raw.dat"); e.setCancellable(fin::close); byte[] buffer = new byte[4096]; for (;;) { int r = fin.read(buffer); if (r < 0) { break; } e.onNext(buffer); } e.onComplete(); });

y usaría setDisposable si usa un Scheduler :

 Observable.create((ObservableEmitter<Event> e) -> { Worker worker = Schedulers.io().createWorker(); e.setDisposable(worker); eventSource.onEvent(es -> worker.schedule(() -> e.onNext(es)) ); });
over 4 years ago · Santiago Trujillo Relatório

0

El Cancellable termina siendo envuelto en un Disposable , por lo que el efecto final es el mismo para cualquiera de las llamadas. La diferencia es que Disposable tiene más funciones que quizás no desee implementar, por lo que la sencilla interfaz Cancellable está ahí como alternativa.

Si solo desea deshacerse de algo cuando finalice el observable, use Cancellable . Si tiene un recurso que podría desecharse debido a algún motivo externo, desea implementar Disposable para implementar el método Disposable.isDisposed() .

Tenga en cuenta que los métodos son mutuamente excluyentes. Solo se puede registrar un solo desechable o cancelable a la vez. Llamar a ambos sobrescribe el primero.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda