我有一项服务,它会定期从网站下载一些更新。默认时间很长,大约 10 分钟,我使用启动此服务的 AlarmManager 来做到这一点。
网络可以开启或关闭,以防它关闭服务应该在网络恢复后立即下载新闻,因为间隔很长,在最坏的情况下,您可能需要等待 20 分钟才能进行下一次更新。
我制作了一个网络状态广播接收器,并且用很少的代码制作了一个 NetworkListener 接口:
public interface NetworkStateListener {
public void onNetworkOn();
public void onNetworkDown();
}
所以我的服务有这两种方法,可以知道网络何时开启或关闭。
我的想法如下:在 onStart() 方法中,我生成一个新线程:如果网络关闭线程等待,否则下载。当 onNetworkOn() 被调用时,我调用了一个 notify():
private boolean threadWaiting; //a flag so that I don't spawn multiple threads
public int onStartCommand(Intent intent, int flags, int startId) {
if(!threadWaiting){//if already a thread waiting do nothing and exit
Thread t = new Thread(new Runnable(){
@Override
public void run() {
synchronized(binder){
while(!isNetworkOn())
try {
threadWaiting = true;
binder.wait();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
// blocks until network connection is available
threadWaiting = false;
//... operations ...
这是 onNetworkOn() 方法:
public void onNetworkOn() {
synchronized(binder){
binder.notify();
}
这是正确的方法吗?