定时、轮询

前言

本篇是小编在处理股票价格的定时刷新以及从非交易时间到交易时间过渡时重新唤醒定时刷新的技术总结。

技术方案

Intent.ACTION_TIME_TICK

通过动态注册Intent.ACTION_TIME_TICK这个广播。系统每分钟会发出该广播。 关于Intent.ACTION_TIME_TICK,官方的注释是这样的:

1
2
3
4
5
Added in API level 1
String ACTION_TIME_TICK
Broadcast Action: The current time has changed. Sent every minute. You cannot receive this through components declared in manifests, only by explicitly registering for it with Context.registerReceiver().
This is a protected intent that can only be sent by the system.
Constant Value: "android.intent.action.TIME_TICK"

简单来讲就是每隔1分钟,系统会发出该广播。该广播不能静态注册在manifests文件中,只能使用Context.registerReceiver()动态注册。而且该广播是一个protected类型的广播,只能由系统跳用发出该广播,用户无权发出该广播。

知道了这些,就可以注册操作了。以实现时间段切换的需求。

1
2
3
4
5
6
7
Receiver mTimeTickReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO 这里就可以按需求编写
}
};
registerReceiver(mTimeTickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));

该方式可以在单独的进程中使用,也可以在单独的界面中注册使用。

定时器方式

定时器方式常见的有:Handler,Timer, Thread, AlarmManager等。 这里我想详细介绍一个RxJava提供的方式,Observable.interval()。 小编就编写一个简单Fragment基类来实现该操作。

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* Fragment TimeTick基础类
*/

public abstract class BaseTimeTickFragment extends BaseFragment {

private Subscription mTimeSubscription;

/**
* 处理在viewpager中的情况
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
startTimeTick();
} else {
stopTimeTick();
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
startTimeTick();
return view;
}

@Override
public void onDestroyView() {
super.onDestroyView();
stopTimeTick();
}

private void startTimeTick() {
stopTimeTick();
mTimeSubscription = Observable.interval(Constant.TIME_TICK_INTERVAL, Constant.TIME_TICK_INTERVAL, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
onTimeTick(TimeManager.getInstance().getServiceTime());
}
});
}

private void stopTimeTick() {
if (mTimeSubscription != null && !mTimeSubscription.isUnsubscribed()) {
mTimeSubscription.unsubscribe();
}
}

/**
* 子类实现该方法,会定时调用该方法
* @param millis
*/
protected abstract void onTimeTick(long millis);

}

TimeManager请参考Android时间与服务器同步方案

RxJava 还提供了Observable.timer()方式的定时器。

坚持原创技术分享,您的支持是对我最大的鼓励!