2012-09-09 15 views
0

我有一种服务,它定期从网站下载一些更新。 默认期间很长,大约10分钟,我用AlarmManager启动这项服务。等待服务中的网络变化,以便下载更新

网络可开启或关闭,的情况下,它是关闭的服务应该尽快下载新闻网络收益上,因为间隔较长,在最坏的情况下,你可能要等20分钟,直到下一次更新。

我做了一个网络状态广播接收器,并与少的代码我做了一个NetworkListener接口:

public interface NetworkStateListener { 
public void onNetworkOn(); 
public void onNetworkDown(); 
} 

所以我的服务有以下2种方法,当网络中断或关闭可以知道了。

我的想法如下:在onStart()方法中,我产生了一个新的线程:如果网络关闭线程等待,否则下载。当onNetworkOn()被调用我所说的通知():

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(); 
    } 

这是正确的前进方式是什么?

回答

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; 
    } 
} 
2

这是正确的方法吗?

恕我直言,这是不理想的,因为你在内存中保持服务。另外,如果你的服务是IntentService,你将泄露一个线程,并且可能永远不会发现连通性的变化。

我会在CONNECTIVITY_ACTION广播清单中设置一个BroadcastReceiver,该接收器最初被禁用。如果发生警报时,您发现您没有连接,请启用该接收器。当接收机收到“我们有连接”广播时,请拨打startService()向您的服务发送一条命令,让其完成工作,然后让接收机自行关闭。这样,您无需保持服务始终运行。