【问题标题】:Why is adding and removing a fragment giving me memory leak?为什么添加和删除片段会导致内存泄漏?
【发布时间】:2015-12-30 03:16:04
【问题描述】:

我对 android dev 还很陌生,所以非常感谢任何帮助! 我收到此错误

12-30 08:14:32.391 1726-1741/? E/StrictMode:在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 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(SourceFile:811) 在 com.google.android.gms.http.GoogleHttpClient.a(SourceFile:776) 在 com.google.android.gms.http.GoogleHttpClient.execute(SourceFile:676) 在 com.google.android.gms.http.GoogleHttpClient.execute(SourceFile: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(SourceFile:43) 在 com.google.android.gms.auth.b.b.a(SourceFile:62) 在 com.google.android.gms.auth.b.a.a(源文件:120) 在 com.google.android.gms.auth.b.a.a(SourceFile:61) 在 com.google.android.gms.auth.be.cron.AuthCronService.a(SourceFile:44) 在 com.google.android.gms.gcm.al.run(SourceFile: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);
}

}

【问题讨论】:

  • 能否在片段中附上实际的错误信息及其指向的相关代码?
  • 好的,我添加了错误信息
  • 这看起来更像是 Android 中的一个错误。

标签: java android android-fragments


【解决方案1】:

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

okhttp 参考

毕加索参考资料(作为图书馆可能出现问题的一个例子)

【讨论】:

  • 好的,我添加了片段的代码。老实说,我不知道是什么问题,因为代码真的很简单
  • 更新了答案,我相信您需要通过您的应用程序进程过滤您的 logcat,而不是查看我假设此跟踪来自的所有日志。
  • 这是迄今为止唯一运行的东西,所以我很确定这是该特定进程的 logcat。抱歉,我对此很陌生,我对发生的事情感到非常困惑。
  • 您的设备至少运行了数十个进程。您需要通过应用程序的进程过滤您的 logcat,这是 Android Studio 中 logcat 的默认配置。
  • 我很确定那是默认设置。我设法通过在侦听器中添加片段事务来修复错误。我不知道为什么它解决了这个问题:p 不过非常感谢!
猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多