これは、スタックオーバーフローに関する私の最初の質問です。通常、私は自分で答えを見つけることができますが、今度はまともな答えを見つけることができません。私はアンドロイド向けのアプリも作っているので、あまりにも前から申し訳ありません。httpリクエストをキャンセルする方法
ローカルIPアドレスが利用できないときに、xミリ秒後に 'android java'でhttpリクエストをキャンセルするにはどうすればよいですか? 私はAsyncTaskを使用してhtmlページをリクエストしています。クラスのコードを以下に示します。
今私が持っているのは、onPreExecute()で定義されたtimerで、Xミリ秒後にonCancel()をtrueに設定します。 doInBackground()はストリームなどを開き、その後ストリームを文字列に書き込みます。
ローカルIPアドレスが利用できない場合、url.openStream()関数はtimeOutのためにjava.net.ConnectExceptionが起動するまで実行され続けます。私はonCancel()を使ってこのコマンドをどうやってやりとりするか分からない(これが可能であれば)。
私はどのようにしてurl.openStreamコマンドを干渉しますか?またはAsyncTaskスレッドを一般的に終了するだけですか?
private class htmlToString extends AsyncTask<Void,Void,Void> {
public htmlToString asyncObj;
@Override
protected void onPreExecute(){
asyncObj = this;
new CountDownTimer(connectionTimeout, connectionTimeout) {
public void onTick(long millisUntilFinished) {}
public void onFinish() {
// stop async task if not in progress
if (asyncObj.getStatus() == AsyncTask.Status.RUNNING) {
asyncObj.cancel(true); // <- how can i cancel the doInBackground with this ?
Log.i("timer", "...still trying to connect...");
}
}
}.start();
}
@Override
protected Void doInBackground(Void... params) {
try {
URL url = new URL(url_string[button_state]);
final InputStream url_inputstream = url.openStream(); // <- if the local ip adress is unavailable, this command keeps running until ETIMEDOUT kicks in
InputStreamReader url_inputstreamreader = new InputStreamReader(url_inputstream);
BufferedReader in = new BufferedReader(url_inputstreamreader);
String inputLine;
while ((inputLine = in.readLine()) != null)
page = page.concat(inputLine);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void params){
// some code
}
}
EDIT1:これは、Android Studioの1.5.1
EDIT2で行われます。私は自分でそれを解決しました。私はちょうどjavaによって設定されたタイムアウトを短縮します。私はdoInBackground()でこれを行いました(コードは下記にあります)。これはまた、onPreExecute()内のタイマーを完全に取り除くことができることを意味していました。
@Override
protected Void doInBackground(Void... params) {
try {
URL url = new URL(url_string[button_state]);
URLConnection url_connection = url.openConnection();
url_connection.setConnectTimeout(connectionTimeout); // timout is set here
final InputStream url_inputstream = url_connection.getInputStream();
InputStreamReader url_inputstreamreader = new InputStreamReader(url_inputstream);
BufferedReader in = new BufferedReader(url_inputstreamreader);
String inputLine;
while ((inputLine = in.readLine()) != null)
page = page.concat(inputLine);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
を?私はまた、次のエラーメッセージが表示されます。 "シンボル 'httpclient'を解決できません。私はそれをタイマーの "onfinish"機能に入れようとしました。私はまた、httpclientをasyncObjに置き換えようとしました。また、私はそれをmain - > oncreate()に入れて、httpclientをhtmlToStringクラスに置き換えましたが、エラーメッセージが表示されます: "シンボル 'getConnectionManager'を解決できません" – Malone