【发布时间】:2017-03-24 18:17:49
【问题描述】:
我有这个问题:
我正在使用 Jsoup.connect(url).get() 从多个 url 获取 android asynctask 中的一些数据,然后在 Activity 中显示它。问题是有时我需要在获取 jsoup 结果或捕获超时异常之前中断线程并释放处理器。
代码的重要部分如下所示:
@Override
protected Void doInBackground(String... urls) {
int cpuCount = Runtime.getRuntime().availableProcessors();
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
cpuCount,
cpuCount,
30,
TimeUnit.SECONDS,
queue);
final CountDownLatch countDownLatch = new CountDownLatch(urls.length);
for (final String url : urls) {
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
String html = null;
try {
html = Jsoup.connect(url).get().outerHtml();
} catch (Exception ignored) {
}
if (html != null) {
publishProgress(videoStream);
}
countDownLatch.countDown();
}
});
}
countDownLatch.await();
return null;
}
@Override
protected void onProgressUpdate(String... result) {
updateUiStuff(result[0]);
}
我使用线程池执行器的原因是它并行执行多个线程中的连接,而不是等待一个结果并打开第二个连接等等。
我尝试在 onPreExecute 中设置的按钮上执行 cancel(true); 或 threadPoolExecutor.shutDown(); 和 threadPoolExecutor.shutDownNow();,但它并没有停止 Runnables。即使我关闭活动,Runnables 也会继续运行,直到它们超时,直到那时我无法在网络上做任何事情,因为 jsoup 连接仍在运行。请指出我正确的方向。非常感谢,如果这是一个非常愚蠢的问题,我深表歉意,但我在这里找不到类似的问题。
简而言之:我需要在 AsyncTask 取消时停止线程。
【问题讨论】:
标签: java android multithreading android-asynctask jsoup