尝试在ThreadPoolExecutor Android中取消任务时取消()不起作用

时间:2015-03-14 04:46:01

标签: java android multithreading threadpoolexecutor futuretask

我有一些下载作为ThreadPoolExecutor的任务提交。现在,我在扩展ThreadPoolExecutor的全局类中创建此Application。我将所有提交的任务存储在带有id的hashmap中。

我在片段中有一个列表视图。此列表视图项包含暂停和恢复按钮。当我单击列表项本身时,下载FutureTask将提交给全局池执行程序。现在,当我点击listview项目的暂停按钮时,我希望该特定任务暂停。

我在列表视图的自定义适配器中有暂停按钮的onClick方法。因此,当我单击按钮时,在我的适配器类中,我按名称获取与该列表项相关的未来任务,然后执行.cancel()。当我检查isCancelled()值时,它会返回true。这意味着该任务已被取消,但我的下载仍然运行,文件被完全下载。我怎么解决这个问题?任何帮助,将不胜感激。

PS:我也尝试过将runnable作为参数传递给执行者。然后,我将通过其名称获取线程(使用返回带名称的线程的自定义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);    
}

我的自定义列表在点击暂停按钮内的适配器代码:

    Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub

                                    needToPause = true;
globalstate.pauseTaskMain(threadname);
            }
        }

我实际上更喜欢使用wait()或类似的东西来暂停和恢复我的任务,而不是完全取消任务。任何帮助,将不胜感激。谢谢!

0 个答案:

没有答案