Android:Intentservice、HandleIntentキューでタスクを中止またはスキップする方法
-
27-10-2019 - |
質問
意図サービス(「ダウンロードサービス」)を呼び出すアクティビティ(「アプリケーションアクティビティ」)があります
Intentserviceはバックグラウンドでインターネットからファイルをダウンロードしますが、特定のダウンロードを中止できるようにしたいです........。
それでは、5つのファイルをキューに入れたとしましょう:ファイル1,2,3,4,5
Intent Serviceは番号1のダウンロードを開始し、次に2番目などをダウンロードし始めます。1)Method Handleイベントで現在行っていることをIntent Serviceに分離する方法はありますか(この場合、ファイルをダウンロードします1)次のダウンロードを開始しますか?
2)キューから要素を削除することは可能ですか?たとえば、ファイル1をダウンロードしている間、キューからファイル4を削除して、3番の後に5に直接移動するようにしますか?
まもなく、これらの2つの簡単な操作を実行するためにキューと共同で共同で協力する方法が必要ですが、インターネット上で役に立つものは何も見つかりませんでした:(
TNX
解決 2
私は自分のMyintentserviceクラスを作成して、かなり短く、自分の目的のためにメソッドを変更するオリジナルのクラスをコピーします........特に、私のケースでサービスハンドラーの方法を使用できる要素をデキューするために
mservicehandler.removemessages(appid);
メッセージキューにある特定のコード「What」を使用したメッセージの投稿の投稿を削除すると、各メッセージに追加する各メッセージにラベルを付けなければならないことを意味します。 ..例えば
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
msg.what = intent.getIntExtra("appId", 0); \\parameters that come from the outside
他のヒント
ありがとう @user280560、私はあなたのコメントに基づいた解決策を見つけました:)
特定のケースでキューをクリアしたかった、より具体的な例を挙げるために。
最初に、Intentservice.javaのソースをコピーしました ここ 私のプロジェクト(名前を変更する必要はありません。Intentservice.javaを保持することができます。Androidではなく、インポートするだけです)。それから私はこれを追加しました
public void clearQueue() {
Debug.PrintInfo(TAG, "All requests removed from queue");
mServiceHandler.removeMessages(0);
}
私のIntentserviceソースに。
さて、Intentserviceを拡張する私のサービスから、特定のアクション(ログイン)がサービスに渡されたときにキューをクリアしたかったので、このようにOnstartMethodをオーバーライドしました。
@Override
public void onStart(Intent intent, int startId) {
if(intent.getAction().equals(ACTION_LOGIN)) {
//Login clears messages in the queue
clearQueue();
}
super.onStart(intent, startId);
}
魅力のように機能します:)
それが誰かを助けることを願っています...
Intentserviceクラスを拡張し、キャンセルされたアイテムのリストを宣言します。最後に、あなたの意図を処理する前に、それがキャンセルされていないことを確認してください!
public class MyDownloadService extends IntentService {
private static List<String> canceledUrl;
public static void cancelDownload(String url){
canceledUrl.add(url);
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String url = intent.getStringExtra(EXTRA_URL);
if(!canceledUrl.contains(url)) //if download has not been canceled already
downloadFile(url);
else
canceledUrl.remove(url);
}
}
}
以前にテストしたので、このコードが機能することはわかっていますが、それが正しい方法であるかどうかはわかりません!
Intentserviceにバインドして、ダウンロードをキャンセルまたはDe Queuする方法を作成できます。
ここ あなたが必要とするかもしれない簡単なチュートリアルです
上記の@jeffreyblattmanが言ったように、このようなメッセージにあなた自身の「何」の値を割り当てることで安全にプレイする方が良いです
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
msg.what = 0;
mServiceHandler.sendMessage(msg);
}
キューをクリアします mServiceHandler.removeMessages(0)
.
それが役立つことを願っています。