How to set a timer in android

前端 未结 13 1704
天命终不由人
天命终不由人 2020-11-22 06:43

What is the proper way to set a timer in android in order to kick off a task (a function that I create which does not change the UI)? Use this the Java way: http://docs.ora

相关标签:
13条回答
  • 2020-11-22 07:14

    Probably Timerconcept

    new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interval
    
     public void onTick(long millisUntilFinished) {
      }
      public void onFinish() {
     }
    }.start();
    

    or

    Method 2 ::

    Program the timer

    Add a new variable of int named time. Set it to 0. Add the following code to onCreate function in MainActivity.java.

    //Declare the timer
    Timer t = new Timer();
    //Set the schedule function and rate
    t.scheduleAtFixedRate(new TimerTask() {
    
        @Override
        public void run() {
            //Called each time when 1000 milliseconds (1 second) (the period parameter)
        }
    
    },
    //Set how long before to start calling the TimerTask (in milliseconds)
    0,
    //Set the amount of time between each execution (in milliseconds)
    1000);
    

    Go into the run method and add the following code.

    //We must use this function in order to change the text view text
    runOnUiThread(new Runnable() {
    
        @Override
        public void run() {
            TextView tv = (TextView) findViewById(R.id.main_timer_text);
            tv.setText(String.valueOf(time));
            time += 1;
        }
    
    });
    
    0 讨论(0)
  • 2020-11-22 07:16

    I hope this one is helpful and may take less efforts to implement, Android CountDownTimer class

    e.g.

     new CountDownTimer(30000, 1000) {
          public void onTick(long millisUntilFinished) {
              mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
          }
    
          public void onFinish() {
              mTextField.setText("done!");
          }  
    }.start();
    
    0 讨论(0)
  • 2020-11-22 07:17

    I used to use (Timer, TimerTask) as well as Handler to kick off (time-consuming) tasks periodically. Now I've switched the whole to RxJava. RxJava provides Observable.timer which is simpler, less error-prone, hassle-free to use.

    public class BetterTimerFragment extends Fragment {
      public static final String TAG = "BetterTimer";
      private TextView timeView;
      private Subscription timerSubscription;
    
      @Override
      public View onCreateView(LayoutInflater inflater,
                               @Nullable ViewGroup container,
                               @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_timer, container, false);
      }
    
      @Override
      public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        timeView = (TextView) view.findViewById(R.id.timeView);
      }
    
      @Override
      public void onResume() {
        super.onResume();
    
        // Right after the app is visible to users, delay 2 seconds
        // then kick off a (heavy) task every 10 seconds.
        timerSubscription = Observable.timer(2, 10, TimeUnit.SECONDS)
            .map(new Func1<Long, String>() {
              @Override
              public String call(Long unused) {
                // TODO: Probably do time-consuming work here.
                // This runs on a different thread than the main thread.
                return "Time: " + System.currentTimeMillis();
              }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<String>() {
              @Override
              public void call(String timeText) {
                // The result will then be propagated back to the main thread.
                timeView.setText(timeText);
              }
            }, new Action1<Throwable>() {
              @Override
              public void call(Throwable throwable) {
                Log.e(TAG, throwable.getMessage(), throwable);
              }
            });
      }
    
      @Override
      public void onPause() {
        super.onPause();
    
        // Don't kick off tasks when the app gets invisible.
        timerSubscription.unsubscribe();
      }
    }
    
    0 讨论(0)
  • 2020-11-22 07:17

    For timing operation you should use Handler.

    If you need to run a background service the AlarmManager is the way to go.

    0 讨论(0)
  • 2020-11-22 07:19

    I believe the way to do this on the android is that you need a background service to be running. In that background application, create the timer. When the timer "ticks" (set the interval for how long you want to wait), launch your activity which you want to start.

    http://developer.android.com/guide/topics/fundamentals.html (<-- this article explains the relationship between activities, services, intents and other core fundamentals of Android development)

    0 讨论(0)
  • 2020-11-22 07:20

    It is situational.

    The Android documentation suggests that you should use AlarmManager to register an Intent that will fire at the specified time if your application may not be running.

    Otherwise, you should use Handler.

    Note: The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running. For normal timing operations (ticks, timeouts, etc) it is easier and much more efficient to use Handler.

    0 讨论(0)
提交回复
热议问题