2

ユーザーがクリックしてダウンロードできるアイテムのリストがあります。私はこのコードを持っています:

//Maintained this in my ListAdapter class so that if user clicks on cancel download i can do:
// tasks.get(info.getFieldID()).cancel(true);

public static Map<String, Future<Object>> tasks = new HashMap<String, Future<Object>>();
    Future f = downloadExecutor.submit(new Callable<Object>() {
         // do downloading.
    }
    tasks.put(key,f);

ユーザーが tasks.get(key).cancel(true); を呼び出してキャンセルをクリックすると、それぞれのダウンロードをキャンセルしようとしています。

しかし、私のタスクはキャンセルされません。

いくつかの質問:

  1. アダプター クラスで将来のオブジェクトのリストを維持することで、何か問題がありますか?

  2. ユーザーがボタンをクリックしたときにタスクをキャンセルするにはどうすればよいですか?

  3. また、タスクがキャンセルされたことをどのように知ることができますか?

ExecutorService について読んだことがありますが、実装について少し混乱しています。

4

1 に答える 1

0

あなたは本当に一緒にいくつかの質問をしています。問題の背後にあるロジックは、物理的なアクション (ボタンを押す) と実行可能なアクション (タスクのキャンセル) を関連付けているようです。

簡単に言えば、タスクをキャンセルするには、タスクへの参照を保存する必要があることを認識しているようです。疑似コードでは (特定の実装が異なる可能性があるため)、次のようなものが必要です。

Button myButton = (Button)findViewById(R.id.mybutton);
myButton.setOnClickListener(new OnClickListener() {
    @Override
    onClick(View v) {
        tasks
             // retrieve the proper task based on the button
             .get(oneKey)
             // once you have the task, cancel it
             .cancel(true);
    }
});

上記のコードでは、各ボタンは選択したタスクに関連付けられます。これは、ハードコーディングまたは変数の受け渡しによって実行できます。

ハッシュテーブルを使用して、目的のタスクを取得します。次に、そのcancelメソッドを使用してキャンセルします。

于 2015-09-14T14:08:42.020 に答える