0

最近、「添付のスタック トレースでリソースが取得されましたが、解放されませんでした」という問題に遭遇しました。

使用後に接続を閉じる必要があることを読みました。ここで私を助ける質問が見つからないので、自分で書いています。

これを防ぐために使用された後、入力ストリームを閉じるにはどうすればよいですか?

クラス:

public class SetWallpaperAsync extends AsyncTask<String, String, String> {
private Context context;
private ProgressDialog pDialog;
String image_url;
URL mImageUrl;
String myFileUrl;
Bitmap bmImg = null;

public SetWallpaperAsync(Context context) {
this.context = context;
} 

@Override
protected void onPreExecute() {
// TODO Auto-generated method stub

super.onPreExecute();

pDialog = new ProgressDialog(context);
pDialog.setMessage("Setting Wallpaper...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();

}

@Override
protected String doInBackground(String... args) {
// TODO Auto-generated method stub

try {

    mImageUrl = new URL(args[0]);


    HttpURLConnection conn = (HttpURLConnection) mImageUrl
            .openConnection();
    conn.setDoInput(true);
    conn.connect();
    InputStream is = conn.getInputStream();



    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Config.RGB_565;
    Bitmap bmImag = BitmapFactory.decodeStream(is, null, options);





} catch (IOException e) {
    e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(String args) {
// TODO Auto-generated method stub
WallpaperManager wpm = WallpaperManager.getInstance(context);
try {
    wpm.setBitmap(bmImg);
} catch (IOException e) {

    // TODO Auto-generated catch block
    e.printStackTrace();
}
pDialog.dismiss();

}

}
4

1 に答える 1

1

入力ストリームで close メソッドを呼び出す必要があります。理想的には、例外が発生した場合でも呼び出されるように、これは finally ブロックにある必要があります。これを実現するには、InputStream 宣言を try の外に移動します。

InputStream is = null;

次に、try ブロック内でこれを行うことができます: is = conn.getInputStream();

次に、catch ブロックの後に、finally を含めます。

 finally{
      if(is != null){
          try{
            is.close();
          }catch(Exception e){}
      }
    }
于 2013-11-09T18:34:39.500 に答える