Tôi đang sử dụng hình ảnh để đặt làm nền cho tất cả hoạt động của mình nhưng nó đang gây ra sự cố tràn bộ nhớ và làm hỏng ứng dụng. Bây giờ tôi đang unbinding drawables của tôi trên pause() và trên Destroy() trong hoạt động của tôi và bây giờ nó cho thấy màn hình trống trên cách nhấn nút quay lại. Vì vậy, làm thế nào tôi có thể tránh điều này mà không cần sử dụng thêm bộ nhớ.Hủy liên kết drawables onPause() gây ra điều hướng ngược lại và bỏ qua bước này gây ra tràn bộ nhớ
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.login_root));
}
protected void onDestroy() {
unbindDrawables(findViewById(R.id.login_root));
super.onDestroy();
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
Ban đầu tôi đã thổi phồng bố trí của tôi sử dụng android: background = "@ drawable /" mà luôn luôn gây ra lỗi tràn bộ nhớ nói rằng VM sẽ không cho phép chúng ta phân bổ 10MB Bây giờ tôi nhận được một bitmap từ (ứng dụng). có thể drawable mà không co giãn và ràng buộc nó trên runtime.Now nó nói VM sẽ không cho phép chúng ta phân bổ 5MB (app.) mà không sử dụng unbindDrawables (..) Rõ ràng chất lượng của hình nền được hiển thị đã giảm nhưng tôi không thể để hiểu rằng nếu tôi đang sử dụng tệp png của 13KB, JVM yêu cầu không gian 5 hoặc 10MB để xử lý yêu cầu như thế nào?
Tôi đã thay đổi bố cục bố cục từ phương thức onCreate() sang phương thức onResume() nhưng ứng dụng lại hết bộ nhớ khi nhấn nút quay lại.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void onResume(){
setContentView(R.layout.home);
Bitmap bmp;
ImageView background = (ImageView)findViewById(R.id.iv_home_background);
InputStream is = getResources().openRawResource(R.drawable.background);
bmp = BitmapFactory.decodeStream(is);
background.setImageBitmap(bmp);
super.onResume();
}
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.home_root));
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Hãy nhớ rằng nếu onDestroy() được gọi, onPause() cũng được gọi trước đó. –
unbind chỉ trong 'onPause()' như @JohnSatriano đã nêu. Tuy nhiên, hãy chỉ cho chúng tôi chức năng onResume của bạn –
Tôi đã không ghi đè lên chức năng Tiếp tục của tôi. Tôi hoàn toàn không biết phải làm gì ở đó. – Atinder