この質問は、少し前に質問され、回答されました。リンク。しかし、答えはまだ私を助けませんでした。私は他の投稿のOPと同じような立場にあります。特定のウェブサイトに接続する非同期タスクがありますが、インターネット接続が遅いため、ほとんどの場合、接続に時間がかかります。ユーザーがいつでも接続の試行を停止できるようにしたいと思います。
public class DownloadWebHtml extends AsyncTask<String, Void, Map<String,ArrayList<ArrayList<String>>>> {
HttpURLConnection con = null;
@Override
protected void onPreExecute(){
Button but = (Button) findViewById(301);
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cancel(true);
con.disconnect();
}
});
}
@Override
protected Map<String, ArrayList<ArrayList<String>>> doInBackground(String... urlcodes) {
//stuff
BufferedReader in = null;
try {
URL url = new URL("some url");
con = (HttpURLConnection) url.openConnection();
in = new BufferedReader(new InputStreamReader(con.getInputStream(),Charset.forName("ISO-8859-1")));
String line = "";
while ((line = in.readLine()) != null && !isCancelled()) {
html.add(line);
}
in.close();
} catch (MalformedURLException e) {
return null;
} catch (IOException e) {
return null;
} finally {
con.disconnect();
if (in != null) {
try {
in.close();
} catch (IOException e) {
Log.d("gettxt", e.getMessage());
}
}
}
if(!html.isEmpty()) {
return //stuff;
}
return null;
}
@Override
protected void onCancelled(){
//cancellation
}
//onpostexecute doing stuff
}
ボタンが押されるたびに、接続が確立された後にのみAsyncTask全体がキャンセルされます。ボタンを押すだけでプロセス全体をすぐに停止することは可能ですか?デフォルトのhttpurlconnectionを使用して実行できますか?
con.getInputStream
がビジー状態のときに切断を使用して例外をトリガーしようとしましたが、機能しませんでした。