我有一些下载作为任务提交给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() 或类似的方法暂停和恢复我的任务,而不是完全取消任务。任何帮助,将不胜感激。谢谢!