场景描述:
话说,在程序开发交付测试之后,客户有时会抱怨:“后台明明有新的推送消息,但等了好久都没有看到通知栏有消息通知,是不是程序有问题?”
面对这样的问题,除了检查代码,还能如何呢?
问题剖析:
由于Android客户端采用时间间隔请求拉取的方式,在实现过程中,都是以最理想的状态下实现的,而且没有将请求失败情况考虑在列。因而,在请求失败之后,程序会在预先设定的时间间隔之后才再次发起请求,而重新发起的请求也无法保证一定能够成功,所以就出现了后台有消息,而客户端没响应的情况出现。
网络请求响应时间设置为3s,请求间隔时间段为3min。在理想状态下,每3min的请求都是成功的,所以如果后台有新的消息,在每次请求之后通过通知栏展示给用户。然而,一旦出现请求失败的情况,客户端将会在3min之后才会再发起请求。对于用户来说,这并非什么问题,但是对于测试的客户来说,这就是一个存在的缺陷。为此,应该在请求失败时,再加一些处理,以便能够及时请求到服务器消息。
解决策略实现:
由于请求失败做任何处理,所以才引发此问题的存在。所以要从以下方面解决些问题:
(1)判断请求是否失败;
(2)根据请求状态处理。
通过Service、Handle、Runnable结合处理定时拉取服务器消息。Service提供客户端后台运行保证;Runnable用于逻辑处理(如网络请求);Handle可以定时执行Runnable。
假设:
(1)请求状态为:requestStatus(true:成功,false:失败);
(2)请求间隔时间为:DELAY_MILLIS;
(3)网络请求逻辑函数为:SendRequest()。
实现代码如下:
private Handler handler;
private Runnable runnable;
private final long DELAY_MILLIS = 30000;
private boolean requestStatus = true;
@Override
public void onCreate() {
super.onCreate();
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
sendRequest();
if (requestStatus) {
//请求返回成功时,延时执行
handler.postDelayed(runnable, DELAY_MILLIS);
} else {
//请求返回失败时,即刻执行
handler.post(runnable);
}
}
};
handler.post(runnable);
}
private void sendRequest() {
//模拟网络请求
double num = Math.random();
requestStatus = num > 0.5;
}