2016-04-14 7 views
-1

В действии У меня есть какой-то тайм-аут для действия пользователя. Если пользователь ничего не делает, мне нужно произвести некоторые другие действия для системы. Для этого я использую HandlerЗаменить обработчик Android с помощью RXJava

protected void stopTimeout() 
{ 
    handler.removeMessages(0); 
} 

private void startTimeout() 
{ 
    stopTimeout(); 
    handler.postDelayed(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      //SOME ACTIONS 
     } 
    }, 180 * 1000L); 
} 

Обработчик может быть остановлен на некоторые действия пользователя, такие как кнопки мыши

btnCancel.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      // user actions 
      stopTimeout(); 
     } 
    }); 

Но на данный момент я должен много вариантов действий пользователя. Все это нажатие на stopTimout из асинхронных потоков и обработчика не выглядит правильным решением. Проект Я уже перехожу на RXJava и

Я могу выяснить, как сделать эту часть с RXJava.

+0

Рассмотрите возможность использования 'removeMessagesAndCallbacks (NULL)' для очистки Handler. – Shark

+0

callbacks hell, no thx, просто удалил все это из проекта –

ответ

1

Старт таймера.

private void startTimeout() { 
    stopTimeout(); 

    Observable<Long> observable = Observable 
      .timer(getKeepMyOrderOnDisplayTime(), 
        TimeUnit.SECONDS, Schedulers.computation()); 
    cancelOrderSubscription = observable 
      .subscribeOn(Schedulers.computation()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .map(new Func1<Long, MyOrderStorageItem>() { 
       @Override 
       public MyOrderStorageItem call(Long aLong) { 
        return myOrderStorageItem; 
       } 
      }) 
      .subscribe(new Action1<MyOrderStorageItem>() { 
       @Override 
       public void call(final MyOrderStorageItem myOrderStorageItem) { 
        // SOME ACTION with object, I need 
       } 
      }); 
} 

Остановить таймер.

protected void stopTimeout() { 
    if (cancelOrderSubscription != null) { 
     cancelOrderSubscription.unsubscribe(); 
     cancelOrderSubscription = null; 
    } 
} 

О действиях пользователя добавить стоп-таймер. Если никакие действия пользователя в то время как таймер, действие по умолчанию будет.

0

Его простой:

subscription = Observable.timer(1000, TimeUnit.MILLISECONDS) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(aLong -> whatToDo()); 

private void whatToDo() { 
    System.out.println("Called after 1 second"); 
} 
Смежные вопросы