等待服务中的网络更改,以便下载更新

时间:2012-09-09 08:02:03

标签: android

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

这是正确的方法吗?

2 个答案:

答案 0 :(得分:2)

  

这是正确的方法吗?

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

我会在BroadcastReceiver广播的清单中设置CONNECTIVITY_ACTION,最初禁用该接收器。如果在发生警报时,您发现没有连接,请启用该接收器。当接收方收到“我们有连接”广播时,让它呼叫startService()向您的服务发送命令以进行工作,然后让接收器自行禁用。这样,您无需始终保持服务运行。

答案 1 :(得分: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;
    }
}