我正在开发一款BlackBerry App,可在电池电量达到10%时向服务器发送消息。这是通过在getBatteryStatus()
执行以下操作的构造函数中调用getBatteryStatus()
方法来实现的:
public static void getBatteryStatus() {
timerBattery = new Timer();
taskBattery = new TimerTask() {
public void run() {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
if (DeviceInfo.getBatteryLevel()==10) {
try{
String freeText="Battery level at 10%";
sendBatteryStatus(freeText);
}catch(Exception e){}
}
}
});
}
};
timerBattery.scheduleAtFixedRate(taskBattery, 0, 20000);
}
sendBatteryStatus
将消息发送到服务器并取消定时器。这实际上已根据请求将消息一次发送到服务器。
但是,如果用户开始按照原来的那样运行手机(没有再次调用构造函数),该怎么办?定时器如何重启?我怎样才能在下次再次将消息发送到服务器?
防止以10%发送多个电池电量信息的最佳机制是什么?实际上只发送一次信息,然后在下次电池电量为10%时再次发送信息?
如果在发送邮件后我没有取消计时器,则会多次向服务器发送邮件。
答案 0 :(得分:3)
我实际上认为如果你完全摆脱你的计时器会更好。我认为计时器不会有效地为你提供你想要的一切。
幸运的是,BlackBerry拥有SystemListener界面。像这样实现它:
public final class BatteryListener implements SystemListener {
/** the last battery level we were notified of */
private int _lastLevel = 0;
/** the battery percentage at which we send an event */
private int _threshold = 10;
public BatteryListener() {
Application.getApplication().addSystemListener(this);
}
public void setThreshold(int value) {
_threshold = value;
}
/** call this to stop listening for battery status */
public void stopListening() {
Application.getApplication().removeSystemListener(this);
}
private boolean levelChanged(int status) {
return (status & DeviceInfo.BSTAT_LEVEL_CHANGED) == DeviceInfo.BSTAT_LEVEL_CHANGED;
}
public void batteryStatusChange(int status) {
if (levelChanged(status)) {
int newLevel = DeviceInfo.getBatteryLevel();
if (newLevel <= _threshold && _lastLevel > _threshold) {
// we have just crossed the threshold, with battery draining
sendBatteryStatus("Battery level at " +
new Integer(newLevel) + "%!");
}
_lastLevel = newLevel;
}
}
public void batteryGood() { /** nothing to do */ }
public void batteryLow() { /** nothing to do */ }
public void powerOff() { /** nothing to do */ }
public void powerUp() { /** nothing to do */ }
}
然后,只要您希望应用开始为您监控电池,您就可以创建并保留此类的一个实例。如果电池电量下降到10%,它将发送一条消息。如果用户稍后再次开始充电,然后停止充电,再次消耗10%,则会发送另一条服务器消息。
private BatteryListener listener;
和
listener = new BatteryListener(); // start monitoring
显然,在上面的类中,您要么必须将sendBatteryStatus()
方法添加到类中,要么将该类传递给实现sendBatteryStatus()
方法的对象。
注意:我还建议你不在主线程上向服务器发送通知。您没有显示sendBatteryStatus()
的实现,所以也许您已经是。{但如果没有,请使用后台线程通知您的服务器,因此UI不会被冻结。