0

Webサイトから定期的に更新をダウンロードするサービスがあります。デフォルトの期間は長く、約10分です。これは、このサービスを開始するAlarmManagerを使用して行います。

ネットワークはオンまたはオフにできます。オフの場合、ネットワークがオンに戻ったらすぐにニュースをダウンロードする必要があります。間隔が長く、最悪の場合、次の更新まで20分待たなければならない可能性があるためです。

ネットワーク状態のブロードキャストレシーバーを作成し、わずかなコードでNetworkListenerインターフェイスを作成しました。

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

したがって、私のサービスにはこれら2つの方法があり、ネットワークがいつオンまたはオフになるかを知ることができます

私の考えは次のとおりです。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 に答える