1

にタスクとして送信されるダウンロードがいくつかあります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() などを使用してタスクを一時停止および再開することを好みます。どんな助けでも大歓迎です。ありがとうございました!

4

0 に答える 0