問題
から実行されるメソッドHttpsUrlConnection.getInputStream()
を内部でAsyncTask.doInBackground()
実行していDialogFragment
ます。
ユーザーがフラグメントを終了したときに終了させたい。
そうしないと、無駄なデータがバックグラウンドで読み込まれ続けます。
私が試したこと
URLConnection
オブジェクトをコールバックに設定しようとしnull
ましたonDismiss()
が、メソッドの実行が停止しませんgetInputStream()
。UI スレッドで呼び出すことはできませんmConnection.disconnect()
。別の AsyncTask では効果がありません。これらは順次実行されるためです。
AsyncTask.cancel()
doInBackground()
メソッドを停止しないため、役に立ちません。
質問
getInputStream() メソッドから強制的に戻るにはどうすればよいですか?
コード
@CarlosRobles のリクエストによると、これが私の doInBackground() のコードです。
URL url = new URL(urlString);
setCurrentConnection((HttpsURLConnection) url.openConnection());
mCurrentConnection.setSSLSocketFactory(mSSLSocketFactory);
mCurrentConnection.connect();
int responseCode = mCurrentConnection.getResponseCode();
if (responseCode >= 400) {
throw new IOException("Bad response code");
}
Log.d(TAG, "response code: " + responseCode);
// TODO: Should call .close() if IOException happens here?
InputStream inputStream = mCurrentConnection.getInputStream();
String response = convertStreamToString(inputStream);
inputStream.close();
mCurrentConnection.disconnect();
return response;
その他の考慮事項
UrlConnection.getResponseCode()
上記のスニペットで呼び出されたすべての関数の実行時間を確認したところ、実行に最も時間がかかる関数であることがわかりました。UrlConnection.getInputStream()
内部への呼び出しによるものだと思います。後で、inputStream は常に接続オブジェクトにキャッシュされるためUrlConnection.getInputstream()
、関数でほとんど時間がかかりません。