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();
}
これは続行する正しい方法ですか?