2012-07-24 19 views
11

首先內repeatingly運行一個線程,我甚至不能選擇使用,我讀了好幾個小時,現在,有人說用「處理程序」,有人說用「定時器」的方法。這是我儘量做到:Android的 - 定時器

在喜好,那裏有一個設置(複選框)的啓用/禁用的重複工作。作爲該複選框被選中時,計時器應開始工作和線程應每x秒執行。由於複選框未選中,計時器應停止。

這裏是我的代碼:

檢查時是否複選框被選中與否,如果選中「refreshAllServers」無效將被執行,不帶定時工作。

boolean CheckboxPreference = prefs.getBoolean("checkboxPref", true); 
       if(CheckboxPreference == true) { 
        Main main = new Main(); 
        main.refreshAllServers("start"); 
       } else { 
        Main main = new Main(); 
        main.refreshAllServers("stop"); 
       } 

的refreshAllServers無效,做計時器作業:

public void refreshAllServers(String start) { 

    if(start == "start") { 

     // Start the timer which will repeatingly execute the thread 

    } else { 

     // stop the timer 

      } 

這裏就是我如何執行我的主題:(工作良好,沒有定時器)

Thread myThread = new MyThread(-5); 
       myThread.start(); 

我試過嗎?

我嘗試過的例子,我可以看到從谷歌(處理器,計時器)沒有人的工作,我設法一旦啓動計時器,但回採沒有奏效。 的simpliest &理解的代碼,我在我的研究中看到的是這樣的:

new java.util.Timer().schedule( 
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       // your code here 
      } 
     }, 
     5000 
); 
+1

看看答案[這裏](http://stackoverflow.com/questions/8098806/where-do-i-create-and-use-scheduledthreadpoolexecutor-timertask-or-handler/8102488#8102488)幫助。 – yorkw 2012-07-24 21:26:26

回答

34

只需簡單地使用下面的代碼片段

private Handler handler = new Handler(); 
private Runnable runnable = new Runnable() { 
    public void run() { 
     // 
     // Do the stuff 
     // 

     handler.postDelayed(this, 1000); 
    } 
}; 
runnable.run(); 

要停止使用

handler.removeCallbacks(runnable); 

應該做的伎倆。

+0

您的解決方案運行良好,因爲我找到了其他解決方案。 – sarkolata 2012-07-25 17:52:37

+0

我認爲這是最好的解決方案。 – 2012-07-25 21:17:57

+2

如果用戶想要完成某些使用連接到互聯網的內容,該怎麼辦?應用上述將使處理程序和可運行的UI線程上運行,從而防止做任何網絡事情。你需要在那裏實現線程。 – tony9099 2013-09-23 19:23:05

1

我想用AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html

如果複選框是隨叫隨到方法,其中

AlarmManager alarmManager = (AlarmManager)SecureDocApplication.getContext() 
    .getSystemService(Context.ALARM_SERVICE); 
PendingIntent myService = PendingIntent.getService(context, 0, 
       new Intent(context, MyService.class), 0); 

long triggerAtTime = 1000; 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, 5000 /* 5 sec*/, 
       myService); 

如果複選框處於關閉狀態取消報警管理器

alarmManager.cancel(myService); 
+0

這是我將插入我的代碼的部分? – sarkolata 2012-07-25 15:15:53

+1

有一個類成員變量,它是警報管理器的實例。當複選框正在調用具有該代碼的方法時。當關閉呼叫方法關閉警報管理器。它將在用戶瀏覽活動時發生,然後發生在繼承的Application類中。如果用戶可以退出應用程序,並且仍然需要在服務中運行。 – Maxim 2012-07-25 15:27:24

1

使用CountDownTimer。它的工作方式是,當計時器結束時,它會調用計時器的每一跳的方法,而另一種方法。如果需要的話,你可以重新啓動。另外我認爲你應該開始使用AsyncTask而不是線程。請不要嘗試在Android中管理自己的線程。嘗試如下。它的運行就像一個時鐘。

CountDownTimer myCountdownTimer = new CountDownTimer(30000, 1000) { 

public void onTick(long millisUntilFinished) { 
    mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
    // Kick off your AsyncTask here. 
} 

public void onFinish() { 
    mTextField.setText("done!"); 
    // the 30 seconds is up now so do make any checks you need here. 
} 
}.start(); 
+0

這並不重複做這件事。它一度停止了! – sarkolata 2012-07-25 13:13:41

+0

是的,它不會無限期地運行。如果你想無限期地運行它,你可以考慮一個後臺服務。另一方面,如果條件正確,或者設置較長的持續時間,則沒有什麼可以阻止您重新啓動倒數計時器。 – 2012-07-25 21:13:45

2

感謝大家,我使用Timer解決了這個問題。

   timer = new Timer(); 
      timer.scheduleAtFixedRate( 
         new java.util.TimerTask() { 
          @Override 
          public void run() { 
           for(int i = 0; i < server_amount; i++) { 
             servers[i] = "Updating...";          handler.sendEmptyMessage(0); 
             new MyThread(i); 
             myThread.start(); 
         } 


        }}, 
        2000, 5000 
        ); 
+0

請說明其他解決方案的優點。我沒有看到它。 – 2012-07-25 21:15:59

+0

沒有優勢,我只是發現天堂的答案也工作後,我得到了我的工作。 – sarkolata 2012-07-25 21:30:54

0

「[的ScheduledThreadPoolExecutor]類優選定時器需要多個工作線程時,或者當需要的ThreadPoolExecutor(此類擴展)的額外的靈活性或能力。」

per ...

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

這不是比處理多得多,但究竟跑時不時的選項(副每次計算完成後延遲)。

import java.util.concurrent.ScheduledThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 


... 


final int THREAD_POOL_SIZE = 10; 
final int START_DELAY = 0; 
final int TIME_PERIOD = 5; 
final TimeUnit TIME_UNIT = TimeUnit.SECONDS; 

ScheduledThreadPoolExecutor pool; 

Runnable myPeriodicThread = new Runnable() { 
    @Override 
    public void run() { 
     refreshAllServers(); 
    } 
}; 


public void startTimer(){ 

    pool.scheduleAtFixedRate(myPeriodicThread, 
      START_DELAY, 
      TIME_PERIOD, 
      TIME_UNIT); 

} 

public void stopTimer(){ 

    pool.shutdownNow(); 

}