簡體   English   中英

為什么添加和刪除片段會給我造成內存泄漏?

[英]Why is adding and removing a fragment giving me memory leak?

我對android開發人員還很陌生,因此非常感謝您的幫助! 我收到此錯誤

12-30 08:14:32.391 1726-1741 /? E / StrictMode:在附加的堆棧跟蹤中獲取了資源,但從未釋放過。 有關避免資源泄漏的信息,請參見java.io.Closeable。 java.lang.Throwable:未在com.android.java.util.zip.Inflater。(Inflater.java:82)的dalvik.system.CloseGuard.open(CloseGuard.java:180)處調用顯式終止方法'end'。在com.android.okhttp.internal.http.HttpEngine.unzip(HttpEngine.java:645)上的okhttp.okio.GzipSource。(GzipSource.java:62)在com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine上) com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439)處的com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)處的.java:827)。 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)上的com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)。 com.google.android.gms.http.GoogleHttpClient.a(SourceFile:811)處com.google.android.gms.http上的HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java) com.google.android.gms.http.GoogleHttpClient.a(SourceFile:776)com.com.google.android.gms.http.GoogleHttpClient.execute(SourceFile:660)的。 com.google.android.gms.auth.be上的google.android.gms.auth.be.ja(SourceFile:220)。com.google.android.gms.auth.be上的com.google.android.gms.auth.be.appcert.aa(SourceFile:263)。 com.google.android.gms.auth.be.appcert.ba(SourceFile:43)處的com.google.android.gms.auth.bba(SourceFile:62)處的appcert.aa(SourceFile:132) com.google.android.gms.auth.baa(SourceFile:61)上的.android.gms.auth.baa(SourceFile:120)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);
}

}

堆棧跟蹤中的問題顯然是由okhttp引起的,但不一定是okhttp的錯誤。 這是Google Services的一部分gms內部發生的事實,這表明您可能與該問題無關。 您確定此日志用於您的進程而不是某些系統進程嗎?

okhttp參考

畢加索參考資料(作為圖書館可能出現故障的示例)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM