在布局填充时出现Android oom错误

29 浏览
0 Comments

在布局填充时出现Android oom错误

这个问题已经有了答案

Android:java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM

我有一个包含4个不同屏幕的应用:

  • 主Activity:用于承载Fragment
  • 主Fragment:实际的主Fragment布局(以下是代码)
  • 联系人列表:显示从移动设备上提取的联系人
  • 奖项列表:用户可以获得的奖项列表

除非我完全误读了错误信息,否则似乎存在填充主Fragment的问题,但我不确定是为什么。

我试过将Drawable的大小缩小到总计512kb,因为我读过Android的Bitmap处理方式可能会导致内存问题。

我一直收到以下错误信息:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.smd.android.myapp/com.smd.android.myapp.MainActivity}: android.view.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class android.widget.RelativeLayout
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                         at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                         at android.os.Looper.loop(Looper.java:148)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                      Caused by: android.view.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class android.widget.RelativeLayout
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
                                                                         at com.smd.android.myapp.MainActivityFragment.onCreateView(MainActivityFragment.java:55)
                                                                         at android.app.Fragment.performCreateView(Fragment.java:2220)
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
                                                                         at android.app.BackStackRecord.run(BackStackRecord.java:793)
                                                                         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
                                                                         at android.app.FragmentController.execPendingActions(FragmentController.java:325)
                                                                         at android.app.Activity.performStart(Activity.java:6252)
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                         at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                                                                      Caused by: android.view.InflateException: Binary XML file line #1: Error inflating class android.widget.RelativeLayout
                                                                         at android.view.LayoutInflater.createView(LayoutInflater.java:645)
                                                                         at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
                                                                         at android.view.LayoutInflater.onCreateView(LayoutInflater.java:694)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:762)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
                                                                         at com.smd.android.myapp.MainActivityFragment.onCreateView(MainActivityFragment.java:55) 
                                                                         at android.app.Fragment.performCreateView(Fragment.java:2220) 
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973) 
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
                                                                         at android.app.BackStackRecord.run(BackStackRecord.java:793) 
                                                                         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
                                                                         at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
                                                                         at android.app.Activity.performStart(Activity.java:6252) 
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                         at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                                                                      Caused by: java.lang.reflect.InvocationTargetException
                                                                         at java.lang.reflect.Constructor.newInstance(Native Method)
                                                                         at android.view.LayoutInflater.createView(LayoutInflater.java:619)
                                                                         at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58) 
                                                                         at android.view.LayoutInflater.onCreateView(LayoutInflater.java:694) 
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:762) 
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
                                                                         at com.smd.android.myapp.MainActivityFragment.onCreateView(MainActivityFragment.java:55) 
                                                                         at android.app.Fragment.performCreateView(Fragment.java:2220) 
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973) 
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
                                                                         at android.app.BackStackRecord.run(BackStackRecord.java:793) 
                                                                         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
                                                                         at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
                                                                         at android.app.Activity.performStart(Activity.java:6252) 
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                         at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                                                                      Caused by: java.lang.OutOfMemoryError: Failed to allocate a 150994956 byte allocation with 1044448 free bytes and 94MB until OOM
                                                                         at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                                         at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                                         at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
                                                                         at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
                                                                         at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
                                                                         at android.content.res.Resources.loadDrawableForCookie(Resources.java:2635)
                                                                         at android.content.res.Resources.loadDrawable(Resources.java:2540)
                                                                         at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
                                                                         at android.view.View.(View.java:3948)
                                                                         at android.view.ViewGroup.(ViewGroup.java:573)
                                                                         at android.widget.RelativeLayout.(RelativeLayout.java:248)
                                                                         at android.widget.RelativeLayout.(RelativeLayout.java:244)
                                                                         at android.widget.RelativeLayout.(RelativeLayout.java:240)
                                                                         at java.lang.reflect.Constructor.newInstance(Native Method) 
                                                                         at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
                                                                         at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58) 
                                                                         at android.view.LayoutInflater.onCreateView(LayoutInflater.java:694) 
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:762) 
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
                                                                         at com.smd.android.myapp.MainActivityFragment.onCreateView(MainActivityFragment.java:55) 
                                                                         at android.app.Fragment.performCreateView(Fragment.java:2220) 
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973) 
                                                                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
                                                                         at android.app.BackStackRecord.run(BackStackRecord.java:793) 
                                                                         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
                                                                         at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
                                                                         at android.app.Activity.performStart(Activity.java:6252) 
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                         at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我认为它所指的布局文件是主ActivityFragment:

    

MainActivityFragment:

public class MainActivityFragment extends Fragment {
Button btnSMS;
Button btnContact;
Button btnAward;
SMSHandle smsHandle;
FacebookHandle facebookHandle;
CallbackManager callbackManager;
LoginButton btnLoginFB;
private String TAG = "MainFragment";
public MainActivityFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    smsHandle = new SMSHandle();
    facebookHandle = new FacebookHandle();
    SMSHandle.getStoredContacts();
    FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
    callbackManager = CallbackManager.Factory.create();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_main, container, false);
    btnSMS = (Button)v.findViewById(R.id.btn_sms);
    btnContact = (Button) v.findViewById(R.id.contactButton);
    btnAward = (Button) v.findViewById(R.id.btn_award);
    btnAward.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           getFragmentManager().beginTransaction().replace(R.id.activityContainer,new AwardListFragment()).addToBackStack(null).commit();
        }
    });
    btnContact.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           getFragmentManager().beginTransaction().replace(R.id.activityContainer,new ContactListFragment()).addToBackStack(null).commit();
        }
    });
    btnSMS.setOnClickListener(new View.OnClickListener(){
        public void onClick(View view) {
            //Send SMS
            smsHandle.sendToSelectedContacts(getActivity().getApplicationContext());
            ((MainActivity)getActivity()).requestSMS();
            // Post to Facebook, if logged in
            if(AccessToken.getCurrentAccessToken() != null) {
                facebookHandle.postStatus(facebookHandle.getMsg());
                Log.d(TAG,"Posted to Facebook");
            }
        }
    });
    btnLoginFB = (LoginButton) v.findViewById(R.id.fb_login_button);
    btnLoginFB.setFragment(this);
    btnLoginFB.setPublishPermissions(Arrays.asList("publish_actions"));
    btnLoginFB.registerCallback(callbackManager, new FacebookCallback() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Toast.makeText(getActivity(),"Logged in successfully", Toast.LENGTH_SHORT).show();
            facebookHandle.getUserID();
        }
        @Override
        public void onCancel() {
        }
        @Override
        public void onError(FacebookException error) {
            Log.e(TAG,error.getMessage().toString());
        }
    });
    return v;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}
}

编辑:我已经尝试了java.lang.OutOfMemoryError - BitmapFactory.decode(strPath)Android:java.lang.OutOfMemoryError:推荐的方法但是没有成功。

admin 更改状态以发布 2023年5月22日
0
0 Comments

我找到了解决方案。我在res/drawable文件夹中为每个图像使用了单独的可绘制对象。在drawable-xhdpi、drawable-xxhdpi等文件夹中拥有多个大小的可绘制对象可以解决此问题。

0