0

我有一项服务,它会定期从网站下载一些更新。默认时间很长,大约 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();
    }

这是正确的方法吗?

4

2 回答 2

2

这是正确的方法吗?

恕我直言,这并不理想,因为您将服务保留在内存中。另外,如果您的服务是IntentService,您将泄漏一个线程并且可能永远不会发现连接更改。

我将BroadcastReceiver在清单中设置CONNECTIVITY_ACTION广播,最初禁用该接收器。如果发生警报时发现没有连接,请启用该接收器。当接收器接收到“我们有连接”广播时,让它调用startService()以向您的服务发送命令以完成工作,然后让接收器自行禁用。这样,您就不需要一直保持服务运行。

于 2012-09-09T10:58:59.090 回答
0

已解决:我保留了一个布尔标志“我的服务中错过了更新”:

boolean missedUpdate = false;

然后在我的 onStartCommand 中:

if(isNetworkOn()){
    //do actual code
}else
    missedUpdate = true;

在我的网络上:

public void onNetworkOn(){
    if(missedUpdate){
       //download updated news
       // reset timer
       missedUpdate = false;
    }
}
于 2012-09-12T09:37:47.210 回答