このコードは、メモリリークの問題を引き起こしています BufferedReader および InputStreamReader これは、いくつかの例外の原因である可能性があります。どうすれば変更できますか?
try{
URL url = new URL(sMyUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
while ((str = in.readLine()) != null) {
jsonString += str;
}
in.close();
}catch(Exception e){
}
_try..finally
_ブロックを使用してストリームを閉じる方が安全です。文字列を連結するために設計されているため、StringBuilder
を使用することもできます。また、Exception
をキャッチして何もしないようにする必要があります。また、コードは改行なしで行を連結しています。これはあなたが望むものではないかもしれません、その場合あなたがの各行を読むときappend("\n")
。
これらの変更を加えたバージョンは次のとおりです。
_StringBuilder json = new StringBuilder();
try {
URL url = new URL(sMyUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
try {
String str;
while ((str = in.readLine()) != null) {
json.append(str).append("\n");
}
} finally {
in.close();
}
} catch (Exception e) {
throw new RuntimeException("Failed to read JSON from stream", e);
}
_
コードはきれいではありませんが、メモリリークを引き起こすことはありません。メモリプロファイラーを使用して、メモリが使用されている場所を特定することをお勧めします。それ以外の場合は、Java;)でパフォーマンスチューニングの経験が10年以上ある場合でも推測しているだけです。
より良い代替手段は、Java 7を使用することです。
URL url = new URL(sMyUrl);
try(BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
while ((str = in.readLine()) != null) {
jsonString.append(str).append("\n");
}
}
Java 6以上の場合は、使用できます。
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
try {
while ((str = in.readLine()) != null) {
jsonString.append(str).append("\n");
}
} finally {
in.close();
}