2017-08-19 28 views
1
public class DataManager extends IntentService { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    public DataManager() { 
     super("DataManager"); 
     setIntentRedelivery(true); 
    } 

    @Override 
    protected void onHandleIntent(final Intent intent) { 
     // download and parsing task done here 
    } 
} 

これは私がファイルをダウンロードして解析する目的で使用するインテントサービスです。今、私はファイルのダウンロードのための新しい要求を取得する場合、私は進行中のタスクをクリアし、古い要求をキャンセルする新しい要求のダウンロードを開始する必要があります。だから私はそれを行うために以下のコードを使用します:。複数のバックグラウンドタスクを並列に実行する同じインテントサービス

private void refreshSync() { 
    context.stopService(new Intent(context, DataManager.class)); 
    final Intent mServiceIntent = new Intent(context, DataManager.class); 
    mServiceIntent.putExtras(bundle); 
    context.startService(mServiceIntent); 
} 

ので、サービスが殺され、サービスを開始するための次の要求がintentedされます。しかし、以前のタスクは、ダウンロードを実行する2つの並列タスクの実行を再び開始します。基本的に、私が意図した前のタスクは殺されません。

サービスの進行中のタスクを強制終了し、別の新しいタスクを開始するための回避策はありますか?

+1

私の知る限りでは(そして文書https://developer.android.com/reference/android/app/IntentService.htmlに記載されています)、一度に1つのタスクしか実行できません。したがって、onHandleIntent実装では間違いかもしれません。ファイルの読み込み方法を詳しく説明できますか? –

+0

s3からretrofitコールを使用して複数のファイルをダウンロードし、データベースごとに1つずつ保存します – Ankur

+1

レトロフィットコールは同期していますか?さもなければ、サービスは彼らの進歩を担当しない。また、レトロフィット自体を介してリクエストを取り消したい場合もあります。どのように2つのタスクが並行して実行されることを理解していますか? –

答えて

1

setIntentRedelivery(true);を設定しています。サービスが完全に処理されない場合(onHandleIntentが返されない場合)、サービスの呼び出しに耐えられるように強制します。 IntentServiceに作業スレッドが1つしかない(一度に1つのタスクしか実行できない)という事実を考慮すると、サービスの動作は完全にonHandleIntentの実装に依存します。したがって、実装を分析して目標に合わせて変更するか、または設定する必要があります。setIntentRedelivery(false);

+0

私もそれを試みました。しかし、一度に2つのプロセスが発生する次の意図を開始すると、進捗の意図が再び表示されます – Ankur

1

IntentServiceを使用しないでください。これは要件に一致しません。 IntentServiceは単純なものです。Serviceは、キューを処理してキューを処理し、キューが空のときにシャットダウンします。

あなたはより多くのインテリジェンスを必要とし、自分でそれを実装する方がよいです。 IntentServiceの代わりにちょうどextend ServiceonStartCommand()には、データをダウンロードするバックグラウンドThreadを開始します。その背景をServiceにあるメンバ変数内のThreadのトラックに記録します。 startService()が再度呼び出された場合は、すでにダウンロードが進行中かどうかを確認してください。もしそうなら、それをやめ、新しいファイルをダウンロードするために新しい背景Threadを開始してください。バックグラウンドスレッドを停止するには、Threadに変数booleanを指定し、毎回検査してからダウンロードループ内で調べる必要があります。その変数の状態が変更された場合は、Threadを停止する必要があります。これは、Javaでバックグラウンドスレッドを停止するための標準的なメカニズムです。

+0

ええ、それは前に解決されています..入力と解決に感謝 – Ankur

関連する問題