Java 为什么添加和删除片段会导致内存泄漏?

Java 为什么添加和删除片段会导致内存泄漏?,java,android,android-fragments,Java,Android,Android Fragments,我是android开发新手,因此非常感谢您的帮助! 我得到了这个错误 12-30 08:14:32.3911726-1741/?E/S模式﹕ 已在附加的堆栈跟踪中获取资源,但从未释放。有关避免资源泄漏的信息,请参阅java.io.Closeable。 java.lang.Throwable:未调用显式终止方法“end” 位于dalvik.system.CloseGuard.open(CloseGuard.java:180) 位于java.util.zip.Inflater。(Inflater.j

我是android开发新手,因此非常感谢您的帮助! 我得到了这个错误

12-30 08:14:32.3911726-1741/?E/S模式﹕ 已在附加的堆栈跟踪中获取资源,但从未释放。有关避免资源泄漏的信息,请参阅java.io.Closeable。 java.lang.Throwable:未调用显式终止方法“end” 位于dalvik.system.CloseGuard.open(CloseGuard.java:180) 位于java.util.zip.Inflater。(Inflater.java:82) 位于com.android.okhttp.okio.GzipSource(GzipSource.java:62) 位于com.android.okhttp.internal.http.HttpEngine.unzip(HttpEngine.java:645) 位于com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:827) 位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439) 位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384) 位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) 位于com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105) 位于com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java) 位于com.google.android.gms.http.GoogleHttpClient.a(源文件:811) 位于com.google.android.gms.http.GoogleHttpClient.a(源文件:776) 位于com.google.android.gms.http.GoogleHttpClient.execute(源文件:676) 位于com.google.android.gms.http.GoogleHttpClient.execute(源文件:660) 位于com.google.android.gms.auth.be.j.a(源文件:220) 位于com.google.android.gms.auth.be.appcert.a.a(源文件:263) 位于com.google.android.gms.auth.be.appcert.a.a(源文件:132) 位于com.google.android.gms.auth.be.appcert.b.a(源文件:43) 位于com.google.android.gms.auth.b.b.a(源文件:62) 位于com.google.android.gms.auth.b.a.a(源文件:120) 位于com.google.android.gms.auth.b.a.a(源文件:61) 位于com.google.android.gms.auth.be.cron.AuthCronService.a(源文件:44) 位于com.google.android.gms.gcm.al.run(源文件:135)

以及导致错误的部分代码

 gameLayout.setOnTouchListener(
            new FrameLayout.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    //add bullet upon click
                    bullet_fragment b_fragment = new bullet_fragment();
                    fragmentTransaction.add(R.id.game, b_fragment).commit();

                    //bullet moves around screen (some code here)

                    // removes bullet
                    fragmentTransaction.remove(b_fragment).commit();
                    return true;
                }
          g  }
    );
因此,每次触摸屏幕时,都会生成一个片段,因此屏幕上可能存在多个相同片段,这没有问题 我试着搜索了一下,发现remove()不一定会将片段移动到GC中,但此人没有说如何彻底销毁它。那我怎么做呢?或者,发生这种错误还有其他原因吗

片段代码

public class bullet_fragment extends Fragment {
View bulletView;

ImageView bulletObject;




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    bulletView = inflater.inflate(R.layout.bullet_layout, container, true);
    bulletObject = (ImageView) bulletView.findViewById(R.id.bullet);

    return bulletView;

}
public void shoot(int x, int y){
    FrameLayout.LayoutParams b_params = new FrameLayout.LayoutParams(bulletObject.getLayoutParams());


    final int B_WIDTH= (int) (bulletObject.getWidth() * 0.5);
    final int B_HEIGHT= (int) (bulletObject.getHeight() * 0.5);
    b_params.setMargins(x - B_WIDTH,y - B_HEIGHT,0,0);
    bulletObject.setLayoutParams(b_params);
}

}stacktrace中的问题显然是由okhttp引起的,但不一定是okhttp的错误。事实上,这发生在gms内部,gms是谷歌服务的一部分,这表明你可能与这个问题无关。您确定此日志是针对您的进程而不是某个系统进程的吗

okhttp参考

毕加索参考书(作为图书馆可能出现故障的示例)


您能在片段中附加实际的错误消息和它指向的相关代码吗?好的,我添加了错误消息这看起来更像Android中的bug。好的,我添加了片段的代码。我真的不知道问题出在哪里,因为代码真的很简单更新了答案,我相信你需要通过你的应用程序进程来过滤你的logcat,而不是查看所有的日志,我认为这是这个跟踪的来源。这是到目前为止唯一运行的东西,所以我非常确定这就是特定进程的logcat。很抱歉,我对这一点非常陌生,我真的很困惑到底发生了什么。你的设备至少运行了几十个进程。你需要根据应用程序的进程过滤logcat,这是Android Studio中logcat的默认配置。我很确定这是默认配置。我设法通过在侦听器中添加片段事务来修复错误。我不知道为什么它解决了这个问题:p不过非常感谢!