私はこの問題を持っている: 私はJsoup.connect(url).get()
を使用して複数のURLからアンドロイドasynctaskにいくつかのデータを取得し、その後の活動でそれを示しています。問題は、スレッドを中断してプロセッサを解放してからjsoup結果を取得するかタイムアウト例外をキャッチする必要があることがあることです。タイムアウトの前にJsoup getスレッドを中断するにはどうしたらいいですか?
コードコードの重要な部分は、次のようになります。
@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]);
}
私はスレッドプールエグゼキュータを使用していた理由は、1つのつではなく、結果を待つので、それは並列で複数のスレッドでの接続を行うことで、第2の接続を開くなどである。
私はonPreExecuteで設定されたボタン、上cancel(true);
OR threadPoolExecutor.shutDown();
とthreadPoolExecutor.shutDownNow();
をやってみましたが、それはRunnable
秒を停止していません。私が活動を終了しても、Runnable
はタイムアウトするまで実行を続け、それまではjsoup接続が実行されているのでネットワーク上で何もできません。正しい方向に私を指差してください。多くのおかげで、これは本当に愚かな質問である場合私は謝罪しますが、私はここで同様のものを見つけることができませんでした。
要するに、AsyncTaskがキャンセルされたときにスレッドを停止する必要があります。