【问题标题】:A resource was acquired at attached stack trace but never released - Error在附加的堆栈跟踪中获取了资源但从未释放 - 错误
【发布时间】:2025-12-27 10:35:10
【问题描述】:

我不确定为什么会收到此错误,我使用模拟器设置壁纸的 5 次中有 2 次出现此错误 - “在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。”

当我使用手机设置壁纸时,它完美无缺。为什么我使用模拟器时会崩溃?

这是我的代码:

public class SetWallpaperAsync extends AsyncTask<String, String, String> {
private Context context;
private ProgressDialog pDialog;
String image_url;
URL mImageUrl;
String myFileUrl1;
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]);
        // myFileUrl1 = 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();

}

}

日志猫:

11-09 15:09:11.726: E/StrictMode(1632): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
11-09 15:09:11.726: E/StrictMode(1632): java.lang.Throwable: Explicit termination method 'end' not called
11-09 15:09:11.726: E/StrictMode(1632):     at dalvik.system.CloseGuard.open(CloseGuard.java:184)
11-09 15:09:11.726: E/StrictMode(1632):     at java.util.zip.Inflater.<init>(Inflater.java:82)
11-09 15:09:11.726: E/StrictMode(1632):     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:96)
11-09 15:09:11.726: E/StrictMode(1632):     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
11-09 15:09:11.726: E/StrictMode(1632):     at libcore.net.http.HttpEngine.initContentStream(HttpEngine.java:528)
11-09 15:09:11.726: E/StrictMode(1632):     at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:836)
11-09 15:09:11.726: E/StrictMode(1632):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
11-09 15:09:11.726: E/StrictMode(1632):     at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
11-09 15:09:11.726: E/StrictMode(1632):     at com.google.ads.internal.f.b(SourceFile:490)
11-09 15:09:11.726: E/StrictMode(1632):     at com.google.ads.internal.f.run(SourceFile:460)
11-09 15:09:11.726: E/StrictMode(1632):     at java.lang.Thread.run(Thread.java:856)

【问题讨论】:

    标签: android inputstream bytearrayoutputstream


    【解决方案1】:

    模拟器默认开启 StrictMode,在真实设备上可以通过以下方式在代码中开启:

    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog()
                                    .penaltyDeath().build());
    

    您在这里遇到的崩溃表明您需要手动关闭打开的网络资源,以便他们可以释放内存,请参阅Android docs: 中的此示例

       URL url = new URL("http://www.android.com/");
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
       try {
         InputStream in = new BufferedInputStream(urlConnection.getInputStream());
         readStream(in);
        finally {
         urlConnection.disconnect();
       }
    

    【讨论】: