InflateException: строка двоичного XML-файла #21: ошибка надувания класса <unknown>, вызванная OutOfMemoryError

Пожалуйста, посмотрите на следующий код

activity_game.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ecran"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.florian.altarconquest.View.EcranJeu">
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@drawable/blue_flag_icon" />

        <TextView
            android:id="@+id/compteurDrapeauBleu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:textColor="#0000CD"
            android:textSize="50dp"
            android:textStyle="bold" />

        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@drawable/red_flag_icon" />

        <TextView
            android:id="@+id/compteurDrapeauRouge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="0"
            android:textSize="50dp"
            android:textStyle="bold"
            android:textColor="#FF0000"/>
        <ImageView
            android:id="@+id/attackToken"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="@drawable/jeton_noir_et_tour"
            />
        <ImageView
            android:id="@+id/defencetoken"
            android:background="@drawable/jeton_blanc_et_tour"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            />

    </LinearLayout>
    <Button
        android:id="@+id/flagButton"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="100dp"
        android:background="@drawable/flag_icon" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="50dp"
        android:orientation="horizontal">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="30"
            android:orientation="horizontal"></LinearLayout>
        <Button
            android:id="@+id/qrCodeButton"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="@drawable/qr_code_icon" />
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="30"
            android:orientation="horizontal">
        </LinearLayout>
        <Button
            android:id="@+id/mapButton"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@drawable/map_icon" />
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="30"
            android:orientation="horizontal"></LinearLayout>
    </LinearLayout>
    <Button
        android:id="@+id/unactiveTreeButton"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/unactive_tree" />
    <Button
        android:id="@+id/treeButton"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/tree_icon" />
</RelativeLayout>
<ImageView
    android:id="@+id/economyEnergie"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

EcranJeu.java

открытый класс EcranJeu расширяет FragmentActivity, реализует OnMapReadyCallback {

public GoogleMap mMap;
public EcomieEnergie economieEnergie;
private Button mapButton, flagButton, qrCodeButton, treeButton, unactiveTreeButton;
private static ImageView attackToken;
private static ImageView defenceToken;
private Boolean attackTokenAvailable = true, defenseTokenAvailable = true;
private RelativeLayout ecran;
private ArrayList<Button> boutonsDeployables;
public ImageView imageEconomie;

private String pseudo;
private String gameId;
private Game game;

private final int REQUEST_CODE = 128;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    imageEconomie = (ImageView) findViewById(R.id.economyEnergie);

    boutonsDeployables = new ArrayList<Button>();


    Bundle bundle = getIntent().getExtras();
    game = bundle.getParcelable("game");

    if (savedInstanceState == null) {
        Bundle extras = getIntent().getExtras();
        if(extras == null) {
            gameId = null;
        } else {
            gameId = extras.getString("STRING_GAMEID");
        }
    } else {
        gameId = (String) savedInstanceState.getSerializable("STRING_GAMEID");
    }

    boutonsDeployables = new ArrayList<Button>();

    attackToken = (ImageView) findViewById(R.id.attackToken);
    defenceToken = (ImageView) findViewById(R.id.defencetoken);


    mapButton = (Button) findViewById(R.id.mapButton);
    boutonsDeployables.add(mapButton);
    mapButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Ouvre la grande map avec l'altar
            // A compléter
        }
    });

    flagButton = (Button) findViewById(R.id.flagButton);
    boutonsDeployables.add(flagButton);
    flagButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Code pour intercepter un drapeau ennemi
            // A compléter
        }
    });

    qrCodeButton = (Button) findViewById(R.id.qrCodeButton);
    boutonsDeployables.add(qrCodeButton);
    qrCodeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ouvrirScanQrCode();
        }
    });

    for(Button leBouton: boutonsDeployables){
        leBouton.setVisibility(View.INVISIBLE);
        leBouton.setClickable(false);
    }

    treeButton = (Button) findViewById(R.id.treeButton);
    treeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // On clique sur le bouton du milieu, affichage
            // des trois autres boutons
            for(Button leBouton: boutonsDeployables){
                leBouton.setVisibility(View.VISIBLE);
                leBouton.setClickable(true);

                treeButton.setVisibility(View.INVISIBLE);
            }
        }
    });


    economieEnergie = new EcomieEnergie(this);
    economieEnergie.start();


    Timer timer = null;
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            ServerReceptionCoordinates src = new ServerReceptionCoordinates(game);
            src.execute();
        }
    };

    timer.schedule(timerTask, 0, 1000);

}

public void onWindowFocusChanged(boolean hasFocus) {

    super.onWindowFocusChanged(hasFocus);

    unactiveTreeButton = (Button)findViewById(R.id.unactiveTreeButton);

    unactiveTreeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(qrCodeButton.isClickable()){
                for(Button leBouton: boutonsDeployables){
                    leBouton.setVisibility(View.INVISIBLE);
                    leBouton.setClickable(false);
                }

                treeButton.setVisibility(View.VISIBLE);
                treeButton.setClickable(true);
            }
        }
    });


}

public void ouvrirScanQrCode() {
    Intent intent = new Intent(this, EcranScanQrCode.class);
    startActivity(intent);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    double depInfoLat = 48.08574927627401;
    double depInfoLng = -0.7584989108085632;

    // Initialisation de la position de départ de la caméra
    LatLng startCameraPosition = new LatLng(depInfoLat, depInfoLng);
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(startCameraPosition, 17.0f));


    GroundOverlayOptions groundOverlayOptions = new GroundOverlayOptions();
    BitmapDescriptor image = BitmapDescriptorFactory.fromResource(R.drawable.echologia_map);

    groundOverlayOptions.image(image).position(new LatLng(48.10872932860948, -0.7233687971115112), 380f).transparency(0.2f);
    GroundOverlay imageOverlay = mMap.addGroundOverlay(groundOverlayOptions);


    demanderPermissionGps();
    launchServerRequest(game);

}

public void launchServerRequest(Game game){
    Log.i("Début", "requete serveur flags");
    ServerReceptionFlagsPositions srf = new ServerReceptionFlagsPositions(game, this);
    srf.execute();
}

public void demanderPermissionGps(){
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        mMap.setMyLocationEnabled(true);
    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    mMap.setMyLocationEnabled(true);
                }

            } else {
                demanderPermissionGps();
            }
            return;
        }

    }
}


public static void setDefencetoken(boolean defenceTokenAvailable){
    if(defenceTokenAvailable){
        defenceToken.setImageResource(R.drawable.jeton_blanc);
    }
    else{
        defenceToken.setImageResource(R.drawable.jeton_blanc_et_tour);
    }

}

public static void setAttackToken(boolean attackTokenAvailable){
    if(attackTokenAvailable){
        attackToken.setImageResource(R.drawable.jeton_noir);
    }
    else{
        attackToken.setImageResource(R.drawable.jeton_noir_et_tour);
    }

}

}

Когда я запускаю приложение и изменяю активность на EcranJeu, оно падает. Я знаю, что это из-за изображения, но я определенно не могу найти правильный.

12-12 22:00:59.580 24658-24658/com.example.florian.altarconquest E/AndroidRuntime: FATAL EXCEPTION: main
                                                                               Process: com.example.florian.altarconquest, PID: 24658
                                                                               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.florian.altarconquest/com.example.florian.altarconquest.View.EcranJeu}: android.view.InflateException: Binary XML file line #21: Binary XML file line #21: Error inflating class <unknown>
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2464)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)
                                                                                   at android.app.ActivityThread.access$900(ActivityThread.java:154)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                   at android.os.Looper.loop(Looper.java:234)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5526)
                                                                                   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 #21: Binary XML file line #21: Error inflating class <unknown>
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
                                                                                   at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:400)
                                                                                   at android.app.Activity.setContentView(Activity.java:2177)
                                                                                   at com.example.florian.altarconquest.View.EcranJeu.onCreate(EcranJeu.java:60)
                                                                                   at android.app.Activity.performCreate(Activity.java:6285)
                                                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524) 
                                                                                   at android.app.ActivityThread.access$900(ActivityThread.java:154) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                   at android.os.Looper.loop(Looper.java:234) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5526) 
                                                                                   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 9437196 byte allocation with 5482336 free bytes and 5MB 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:2647)
                                                                                   at android.content.res.Resources.loadDrawable(Resources.java:2552)
                                                                                   at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
                                                                                   at android.view.View.<init>(View.java:4030)
                                                                                   at android.widget.ImageView.<init>(ImageView.java:145)
                                                                                   at android.widget.ImageView.<init>(ImageView.java:140)
                                                                                   at android.widget.ImageView.<init>(ImageView.java:136)
                                                                                   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.rInflate(LayoutInflater.java:835) 
                                                                                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 
                                                                                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 
                                                                                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
                                                                                   at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:400) 
                                                                                   at android.app.Activity.setContentView(Activity.java:2177) 
                                                                                   at com.example.florian.altarconquest.View.EcranJeu.onCreate(EcranJeu.java:60) 
                                                                                   at android.app.Activity.performCreate(Activity.java:6285) 
                                                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) 
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524) 
                                                                                   at android.app.ActivityThread.access$900(ActivityThread.java:154) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                   at android.os.Looper.loop(Looper.java:234) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5526) 
                                                                                   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)

Ошибка нацелена на эту строку:

setContentView(R.layout.activity_game);

1 ответ

Решение

У вас есть куча ImageView виджеты, на которых вы используете android:background скорее, чем android:src, Непонятно, зачем ты это делаешь.

Независимо от того, на одном из них вы пытаетесь загрузить извлекаемый ресурс, который при декодировании занимал бы 9437196 байт пространства кучи. Это эквивалент изображения 1536x1536. Это слишком много.

Итак, переключитесь на android:src и использовать много растровых изображений с более низким разрешением. Размер растровых изображений на диске не имеет значения.

Кроме того, если вы случайно поместили эти изображения в res/drawable/имейте ввиду, что это синоним res/drawable-mdpi/ и указывает, что ваши изображения должны быть масштабированы для экранов с более высокой плотностью.

Другие вопросы по тегам