2012-09-09 16 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()向您的服務發送一條命令,讓其完成工作,然後讓接收機自行關閉。這樣,您無需保持服務始終運行。