にタスクとして送信されるダウンロードがいくつかありますThreadPoolExecutor
。現在、これThreadPoolExecutor
を拡張するグローバル クラスで作成していますApplication
。送信されたすべてのタスクを ID 付きのハッシュマップに保存しています。
フラグメントにリスト ビューがあります。このリスト ビュー アイテムには、一時停止ボタンと再開ボタンが含まれています。リスト項目自体をクリックすると、ダウンロードFutureTask
がグローバル プール エグゼキュータに送信されます。ここで、リストビュー アイテムの一時停止ボタンをクリックすると、その特定のタスクが一時停止します。
onClick
リスト ビューのカスタム アダプターに一時停止ボタンのメソッドがあります。そのため、ボタンをクリックすると、アダプター クラスで、そのリスト項目に関連する将来のタスクを名前で取得し、.cancel()
. isCancelled()
値を確認すると、 が返されますtrue
。これは、タスクがキャンセルされたことを意味しますが、ダウンロードは引き続き実行され、ファイルは完全にダウンロードされます。どうすればこれを解決できますか? どんな助けでも大歓迎です。
PS: 実行可能プログラムを引数としてエグゼキュータに渡して、スレッドを送信しようとしました。次に、その名前でスレッドを取得し (名前付きのスレッドを返すカスタムを使用) 、再開ボタンが再度押されるまでThreadFactory
呼び出します。thread.wait()
どちらも機能しません!
サンプルコードは次のとおりです。
私のGlobalStateクラス:
public class GlobalState extends Application{
HashMap<String, Future<?>> futureMapMain = new HashMap<String, Future<?>>();
ThreadPoolExecutor mainExec = new ThreadPoolExecutor(2, 2, 2000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new YourThreadFactory());
public void submitTaskMain(String name, FutureTask<String> task){
Future<?> longRunningTaskFuture = mainExec.submit(task);
futureMapMain.put(name, longRunningTaskFuture);
}
public void cancelTaskMain(String name){
futureMapMain.get(name).cancel(true);
Log.e("Global State", "task cancelled?: " + futureMapMain.get(name).isCancelled());
futureMapMain.remove(name);
}
public void pauseTaskMain(String name){
paused = true;
while(paused==true){
try {
synchronized(futureMapMain.get(name)){
futureMapMain.get(name).wait();
}
// Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void resumeTaskMain(String name){
paused = false;
synchronized(futureMapMain.get(name)){
futureMapMain.get(name).notify();
}
}
public HashMap<String, Future<?>> getFutureMap(){
return futureMapMain;
}
public ThreadPoolExecutor getMainExeutor(){
return mainExec;
}
public class YourThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
return new Thread(r, gettName());
}
}
}
私のフラグメントクラス内に書かれている私のダウンロードメソッド。リスト項目のクリックで実行されます:
public void abDownloadTask(){
FutureTask<String> fTask = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
for(something) {
/* DOES SOME DOWNLOAD USING url.getcontent() with different urls in a loop and stores files to sd card. */
}
}
}
mainGs = (GlobalState) getActivity().getApplication();
mainExec = mainGs.getMainExeutor();
mainGs.settName(somenameforThread);
mainGs.submitTaskMain(someNameforThread, fTask);
}
一時停止ボタンの onclick 内のカスタム リスト アダプター コード:
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
needToPause = true;
globalstate.pauseTaskMain(threadname);
}
}
実際には、タスクを完全にキャンセルするよりも、wait() などを使用してタスクを一時停止および再開することを好みます。どんな助けでも大歓迎です。ありがとうございました!