Таймер, который автоматически нажимает эту кнопку каждые 20 секунд - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть эта кнопка, для которой я хочу установить таймер, чтобы пользователю не приходилось нажимать ее каждый раз, чтобы он автоматически нажимал эту кнопку каждые 20 секунд.Как мне это установить?

По сути, я использую вкладку, так что у вас всего 3 вкладки.На первой вкладке есть эта кнопка, которую мне нужно нажать на кнопку, поэтому я могу получать информацию из веб-сервиса, и этот веб-сервис будет обновляться каждый раз.Когда я нажимаю на другие вкладки и возвращаюсь к первой вкладке, я хочу, чтобы она автоматически обновлялась .. Вместо нажатия кнопки для обновления.

            holder.btnClick.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
             }
});

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Более эффективный способ, которым ИМО использует ScheduledExecutorService :

private void doTheActualJobWhenButtonClicked() {
  // put whatever you need to do when button clicked here
  ... ...
}

... ...

holder.btnClick.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    // job triggered by user click button:
    doTheActualJobWhenButtonClicked();
  }
});

... ...

ScheduledExecutorService scheduleTaskExecutor= Executors.newScheduledThreadPool(1);

// This schedule a task to run every 20 seconds:
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
  public void run() {
    // job triggered automatically every 20 seconds:
    doTheActualJobWhenButtonClicked();
  }
}, 0, 20, TimeUnit.SECONDS);

UPDATE: Если вы нажмете кнопку, чтобы выполнить какое-либо обновление пользовательского интерфейса, например, обновить текст в TextView, тогда просто перенесите вызов вашего метода в runOnUiThread ():

private void doTheActualJobWhenButtonClicked() {
  myTextView.setText("refreshed");
}

ScheduledExecutorService scheduleTaskExecutor= Executors.newScheduledThreadPool(1);
// This schedule a task to run every 20 seconds:
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
  public void run() {
    // involved your call in UI thread:
    runOnUiThread(new Runnable() {
      public void run() {
        doTheActualJobWhenButtonClicked();
      }
    });        
  }
}, 0, 20, TimeUnit.SECONDS);

Также вам необходимо корректно завершить работу ScheduledExecutorService перед тем, как открыть следующее действие или закрыть текущее действие:

// Shut down scheduled task before starting next activity
if (scheduleTaskExecutor != null)
  scheduleTaskExecutor.shutdownNow();
Intent intent = new Intent(getBaseContext(), NextActivity.class);
startActivity(intent);

... ...

public void onDestroy() {
  super.onDestroy();
  // Shut down scheduled task when closing current activity
  if (scheduleTaskExecutor != null)
    scheduleTaskExecutor.shutdownNow();
}

Надеюсь, эта помощь.

1 голос
/ 08 декабря 2011

Так как у вас есть кнопка, я предполагаю, что у вас есть метод ActionPerformed в каком-то месте.

Учитывая это, вы можете сделать это:

public class AutoClick extends Thread {
  // Time to wait in milliseconds
  private long wait;

  //Latency excepted
  private long lat;

  AutoClick(long time, long latency) {
    wait = time;
    lat = latency;
  }

  public void run() {
    long start = System.getCurrentTimeMillis();

    long current;
    while(true)
      current = System.getCurrentTimeMillis();
      long step = (current-start) % 20000;
      if(step <= latency || step >= wait-latency)
        //call the action-performed method
  }
}

Затем создайте экземпляр потока и запустите его:

public AutoClick clicker = new AutoClick(20000);

clicker.run();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...