private Disposable disposeInUiThread(final Action action) { return Disposables.fromAction(new Action() { @Override public void run() throws Exception { if (Looper.getMainLooper() == Looper.myLooper()) { action.run(); } else { final Scheduler.Worker inner = AndroidSchedulers.mainThread().createWorker(); inner.schedule(new Runnable() { @Override public void run() { try { action.run(); } catch (Exception e) { onError("Could not unregister receiver in UI Thread", e); } inner.dispose(); } }); } } }); } }
@Override protected void subscribeActual(final Observer<? super BleAdapterState> observer) { final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); observer.onNext(mapToBleAdapterState(state)); } } }; observer.onSubscribe(Disposables.fromAction(new Action() { @Override public void run() throws Exception { try { context.unregisterReceiver(receiver); } catch (IllegalArgumentException exception) { Log.d(TAG, "The receiver is already not registered."); } } })); context.registerReceiver(receiver, createFilter()); }
@Test public void fromAction() { class AtomicAction extends AtomicBoolean implements Action { private static final long serialVersionUID = -1517510584253657229L; @Override public void run() throws Exception { set(true); } } AtomicAction aa = new AtomicAction(); Disposables.fromAction(aa).dispose(); assertTrue(aa.get()); }
@Test public void fromActionThrows() { try { Disposables.fromAction(new Action() { @Override public void run() throws Exception { Disposables.fromAction(new Action() { @Override public void run() throws Exception { Disposables.fromAction(new Action() { @Override public void run() throws Exception {
@Override public void subscribe(ObservableEmitter<T> tEmitter) throws Exception { final FIFORunnableEntry entry = new FIFORunnableEntry<>(operation, tEmitter); tEmitter.setDisposable(Disposables.fromAction(new Action() { @Override public void run() throws Exception { if (queue.remove(entry)) { logOperationRemoved(operation); } } })); logOperationQueued(operation); queue.add(entry); } });
@Test public void disposeThrowsCheckedException() { CompositeDisposable cd = new CompositeDisposable(); cd.add(Disposables.fromAction(new Action() { @Override public void run() throws Exception { throw new IOException(); } })); Disposable d1 = Disposables.empty(); cd.add(d1); try { cd.dispose(); fail("Failed to throw"); } catch (RuntimeException ex) { // expected if (!(ex.getCause() instanceof IOException)) { fail(ex.toString() + " should have thrown RuntimeException(IOException)"); } } assertTrue(d1.isDisposed()); }
@Test public void disposeThrowsIAE() { CompositeDisposable cd = new CompositeDisposable(); cd.add(Disposables.fromAction(new Action() { @Override public void run() throws Exception { throw new IllegalArgumentException(); } })); Disposable d1 = Disposables.empty(); cd.add(d1); try { cd.dispose(); fail("Failed to throw"); } catch (IllegalArgumentException ex) { // expected } assertTrue(d1.isDisposed()); }
@Test public void disposeThrowsError() { CompositeDisposable cd = new CompositeDisposable(); cd.add(Disposables.fromAction(new Action() { @Override public void run() throws Exception { throw new AssertionError(); } })); Disposable d1 = Disposables.empty(); cd.add(d1); try { cd.dispose(); fail("Failed to throw"); } catch (AssertionError ex) { // expected } assertTrue(d1.isDisposed()); }
@Override public void subscribe(final ObservableEmitter<String> emitter) throws Exception { final SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { emitter.onNext(key); } }; pref.registerOnSharedPreferenceChangeListener(listener); emitter.setDisposable(Disposables.fromAction(new Action() { @Override public void run() throws Exception { log.d("Un-registering PrefCompat"); pref.unregisterOnSharedPreferenceChangeListener(listener); } })); } });