[Android] InflateException veroorzaakt door Exception

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 27-05 11:50

Twazerty

AVCHDCoder developer

Topicstarter
Ik ben bezig om bugs te fixen in een android applicatie die niet door mij is geschreven. De meeste bugs en problemen heb ik op kunnen lossen door goed te debuggen en code te analyseren. Echter nu zit ik nog met een hardnekkig probleem waarvan ik de oorzaak (nog) niet kan vinden. Het probleem is als volgt:
Vanuit een scherm wordt een andere Activity gestart (meestal vanuit de class CasinoGameChanceView). Direct gaat het mis met een InflateException en een Exception die vanuit een andere class wordt opgegooid maar niet wordt afgevangen:
quote: debug
2011-10-12 17:18:36
Message: Unable to start activity ComponentInfo{com.erfenis/com.erfenis.views.CasinoGameChanceView}: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
android.app.ActivityThread.access$1500(ActivityThread.java:121)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:3701)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
dalvik.system.NativeStart.main(Native Method)
2011-10-12 17:18:37
Message: Unable to start activity ComponentInfo{com.erfenis/com.erfenis.views.PhotoAssignmentView}: java.lang.NullPointerException: Assignment not found.
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
android.app.ActivityThread.access$1500(ActivityThread.java:121)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:3701)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
com.android.internal.os.ZygoteInit.main(ZygoteIni
Het vervelende is dat in vrijwel alle gevallen dit probleem zich niet voordoet. Enkele keren op de 30 keer gaat het fout. Ook is het lijnnummer en class/xml waar dit zich voordoet verschillend. Ik heb nu 4 logs met de volgende combinaties:
- InflateException in CasinoGameChanceView op regel 2 in het bijbehorende xml bestand die geladen wordt
- InflateException in CasinoGameChanceView op regel 40 in het bijbehorende xml bestand die geladen wordt
- InflateException in DialogActivity (eigen class) op regel 21 in het bijbehorende xml bestand die geladen wordt
- Binary XML file line #77: Error inflating class <unknown> zonder verdere info. Dus ik weet niet vanuit welke class deze komt

De onderste error uit bovenstaande log is exact hetzelfde voor alle 4 InflateExceptions. Het meest logische is dat de eerste Exception de tweede veroorzaakt aangezien de tijd 0 of 1 seconde eerder geregistreerd word. Echter klinkt dat wat onlogisch aangezien de tweede exception bij alle 4 de crashes hetzelfde is. Je zou dus denken dat de oorzaak is. De vraag waar ik nu mee zit is het volgende:
Kan een InflateException ontstaan als de applicatie een Exception opgooit die niet afgevangen wordt (en de applicatie gekilled wordt zodat deze weer opnieuw start)?

Of is het juist zo dat toch de InflateException eerst wordt opgegooid en als gevolg de andere Exception ontstaat? Als dit zo zou zijn, wat zouden dan oorzaken kunnen zijn van een InflateException? Deze InflateException wordt dus maar uiterst zelden in de telefoon opgegooid over alle Activity starts heen bekeken.

Ook wordt ergens PhotoAssignmentView gestart zonder op het eerste gezicht aantoonbare oorzaak. Er zit namelijk geen harde link tussen PhotoAssignmentView en CasinoGameChanceView. Ze roepen elkaar niet aan.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 27-05 11:50

Twazerty

AVCHDCoder developer

Topicstarter
iemand tips of ideeën?

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

Anoniem: 347253

Kan je de code posten waarmee je deze activity start?

Acties:
  • 0 Henk 'm!

  • PieterAelse
  • Registratie: Februari 2007
  • Laatst online: 06-04 16:14
Nog nooit een InflateException zien langskomen, maar klinkt alsof er een View niet getoond kan worden (in Android woorden: inflaten).
Aangezien de error verwijst naar een XML file zou dat goed de layout van de activity kunnen zijn. Misschien staat daar iets aparts in.
Zou je die code ook eens kunnen posten?

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 27-05 11:50

Twazerty

AVCHDCoder developer

Topicstarter
Zo wordt de Activity gestart:
Java:
1
2
3
4
Intent casinoGameChanceActivity = new Intent(DialogActivity.this, CasinoGameChanceView.class);
casinoGameChanceActivity.putExtra("visitKey", _casinoVisitKey);
casinoGameChanceActivity.putExtra("casino", _casinoKey);
DialogActivity.this.startActivityForResult(casinoGameChanceActivity, RequestCode.CASINO_GAME_CHANCE_VIEW);



Dit is de onCreate in de class CasinoGameChanceView.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        MainView.setMessagesPaused(true);
        
        Bundle extras = this.getIntent().getExtras(); 
        _casinoVisitKey = extras.getString("visitKey");
        _casinoKey = extras.getString("casino");
        
        setContentView(R.layout.casinogamechance);
        random = new Random(System.currentTimeMillis());
        cardView = (ImageView)findViewById(R.id.casinoChanceCard);
        upButton = (ImageButton)findViewById(R.id.casinoChanceArrowUp);
        downButton = (ImageButton)findViewById(R.id.casinoChanceArrowDown);
        pointView = (TextView)findViewById(R.id.casinoChanceScore);
        cardCountView =(TextView)findViewById(R.id.casinoChanceCardCounter);
        createDeck(); //Arraylist vullen
        setRandomCard();

        /* hier worden listeners ingesteld op bovenstaande buttons */
        
        Intent i = new Intent(this, DialogActivity.class);
        i.putExtra(DialogActivity.PLAY_SOUND, false);
        i.putExtra(DialogActivity.PLAY_VIBRATION, true);
        i.putExtra(DialogActivity.DIALOG_TEXT, "In dit casino wordt hoger/lager gespeeld. Je krijgt een kaart te zien en jij moet gokken of de volgende kaart een hoger of lager nummer heeft. 2 is het laagste, de aas is het hoogste. Succes");       
        i.putExtra(DialogActivity.DIALOG_TITLE, "Welkom bij het casino");
        i.putExtra(DialogActivity.DIALOG_TYPE, DialogActivity.TYPE_DIALOG_OK_MESSAGES_PAUSED);
        
        Log.d("Message", "Start activity!");
        this.startActivity(i);


Nu valt mij eigenlijk pas op dat in de meeste classes de layout niet direct wordt ingesteld. In de meeste classes volgt 'setContentView(...);' direct na 'super.onCreate(savedInstanceState);'. Dat je eerst nog gegevens uit de Bundle haalt voordat je setContentView aanroept zou toch geen probleem mogen/kunnen zijn (in 1 van de classes wordt de layout ingesteld afhankelijk van de waarde uit de bundle)?

Overigens lijkt mij niet dat er een fout in de xml zit. Als er een fout in zou zitten dan moet er altijd een error volgen en niet 'soms'. Anyway dit is de xml casinogamechance:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:background="@drawable/background"
  android:layout_height="match_parent" android:orientation="vertical">
    
    <!-- Horizontaal -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    
        <!-- Verticaal -->
         <LinearLayout android:id="@+id/LinearLayout02" android:layout_height="wrap_content" android:layout_width="wrap_content">
            <TextView android:id="@+id/textView1" android:text="Punten: " android:textSize="26sp" android:layout_width="115sp" android:layout_height="wrap_content"></TextView>
            <TextView android:id="@+id/casinoChanceScore" android:text="0" android:textSize="26sp" android:paddingRight="10sp" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
        </LinearLayout>
        <TableLayout android:layout_width="match_parent" 
                     android:layout_height="wrap_content">
            <TableRow android:gravity="right">
                <LinearLayout android:id="@+id/LinearLayout03" android:layout_height="wrap_content" android:layout_width="wrap_content">
                    <TextView android:id="@+id/textView1" android:text="Kaart: " android:textSize="26sp" android:layout_width="70sp" android:layout_height="wrap_content"></TextView>
                    <TextView android:id="@+id/casinoChanceCardCounter" android:text="0/20" android:textSize="26sp" android:paddingRight="10sp" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
                </LinearLayout>
            </TableRow>
        </TableLayout>
  </LinearLayout>
    
    <ImageView android:layout_width="fill_parent"
                android:scaleType="fitCenter"
                        android:id="@+id/casinoChanceCard" 
                android:src="@drawable/diamonds_a_150" 
                android:layout_weight="1" android:layout_gravity="top" android:layout_height="wrap_content"/>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
            <ImageButton android:layout_width="fill_parent"
                        android:layout_height="100sp"
                        android:scaleType="fitXY"
                android:layout_marginLeft="20sp"
                android:layout_marginTop="20sp"
                android:layout_marginRight="20sp" 
                android:background="@null"
                        android:id="@+id/casinoChanceArrowUp"
                        android:layout_weight="1"
                        android:src="@drawable/arrow_up" />
                        
            <ImageButton android:layout_width="fill_parent"
                        android:layout_height="100sp"
                        android:scaleType="fitXY"
                android:layout_marginLeft="20sp"
                android:background="@null"
                        android:layout_weight="1"
                android:layout_marginTop="20sp"
                android:layout_marginRight="20sp" 
                        android:id="@+id/casinoChanceArrowDown" 
                        android:src="@drawable/arrow_down" />
    
    </LinearLayout>
    
    <TextView android:id="@+id/casinoChanceGameOverText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Het spel is afgelopen. Druk op verzend score om je score te vergelijken met het andere team."
            android:textSize="26sp"
            android:visibility="invisible"/>
            
    <Button android:id="@+id/casinoChanceActionButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Verzend score"
            android:visibility="invisible"
            android:textColor="@color/white"
            android:textSize="25sp"
            android:background="@drawable/button1"/>
</LinearLayout>

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

Anoniem: 347253

Ik moet toegeven dat ik het niet zou weten, ik hoop voor je dat iemand anders het wel weet :(

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Ik zie een hele hoop code en erg weinig zelf-inzet... Ligt het aan mij of vraag je uiteindelijk of iemand anders je probleem wilt oplossen? :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • JustAnotherDev
  • Registratie: Augustus 2004
  • Laatst online: 27-05 10:48
Roep je niet meerdere keren de namespace van android, xmlns:android="http://schemas.android.com/apk/res/android" aan? Volgens mij mag je dit alleen eenmaal in het root-element doen.

Acties:
  • 0 Henk 'm!

  • PieterAelse
  • Registratie: Februari 2007
  • Laatst online: 06-04 16:14
Chooman schreef op zondag 16 oktober 2011 @ 23:37:
Roep je niet meerdere keren de namespace van android, xmlns:android="http://schemas.android.com/apk/res/android" aan? Volgens mij mag je dit alleen eenmaal in het root-element doen.
Dit heb ik even geprobeerd, maar meerdere keren die namespace vermelden levert bij mij geen crash of fout op.
Wel is het niet nodig hem meerdere keren te vermelden en zou je inderdaad bij 1x kunnen laten (1e element).

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 27-05 11:50

Twazerty

AVCHDCoder developer

Topicstarter
BtM909 schreef op zondag 16 oktober 2011 @ 23:29:
Ik zie een hele hoop code en erg weinig zelf-inzet... Ligt het aan mij of vraag je uiteindelijk of iemand anders je probleem wilt oplossen? :)
Je moest eens weten hoe lang ik al naar de oorzaak aan het zoeken ben. Code heb ik gepost omdat er om gevraagd werd :)

Het vreemde vind ik dat dit probleem zich soms voordoet en niet altijd. Debuggen is moeilijk aangezien zich dit alleen tijdens een realistische test naar voren komt. In de applicatie is ook nog een geheugen probleem aanwezig (bitmap size exceeds VM budget), maar deze error deed zich niet voor bij het probleem besproken in dit topic. De originele vraag uit dit topic blijft bestaan. Zou een gebrek aan geheugen voor een InflateException kunnen zorgen? maar dat verklaard weer niet de 2e exception die er volgt.
Chooman schreef op zondag 16 oktober 2011 @ 23:37:
Roep je niet meerdere keren de namespace van android, xmlns:android="http://schemas.android.com/apk/res/android" aan? Volgens mij mag je dit alleen eenmaal in het root-element doen.
Zoals hierboven geschreven levert dat geen error op. Mocht het wel een probleem zijn dan zou je verwachten dat je daar direct een error krijgt. In andere xml bestanden staat de namespace ook vaker genoemd en levert verder ook geen problemen op.

[ Voor 23% gewijzigd door Twazerty op 17-10-2011 13:14 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Twazerty schreef op maandag 17 oktober 2011 @ 13:11:
Zou een gebrek aan geheugen voor een InflateException kunnen zorgen?
Ja.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 27-05 11:50

Twazerty

AVCHDCoder developer

Topicstarter
In een gegeven antwoord staat het volgende:
07-11 07:08:01.040: ERROR/AndroidRuntime(15635): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
Deze melding komt niet voor in de stacktrace in mijn start post. In 3 andere logs komt wel deze error voor zonder InflateException.

Stel ik ga er even vanuit dat de InflateException veroorzaakt wordt door een gebrek aan vrij geheugen. Is het dan mogelijk om op andere locaties in de code een Exception te krijgen (zoals beschreven staat in de start post)?

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
offtopic:
Je antwoord wel erg snel.
Twazerty schreef op maandag 17 oktober 2011 @ 13:11:
In de applicatie is ook nog een geheugen probleem aanwezig (bitmap size exceeds VM budget), maar deze error deed zich niet voor bij het probleem besproken in dit topic.
Het valt me op dat dat probleem gelinkt werd in mijn SO-link: http://code.google.com/p/android/issues/detail?id=8488 Ik zou dus eerst dat probleem proberen op te lossen, of de GC als test op strategische plekken laten draaien, dan merk je het vanzelf.. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 27-05 11:50

Twazerty

AVCHDCoder developer

Topicstarter
daar staan veel tips in die het probleem waarschijnlijk doen verdwijnen. Eerst had ik ook de geheugenproblemen met Bitmaps, maar die heb ik opgelost door geen enkele bitmap in de applicatie te gebruiken. Middels URI koppel ik pngs op de SD kaart aan een ImageView.

Ik ga alle tips in die Thread zeker toepassen! mocht ik nog problemen hebben kom ik er op terug. Thx.

Edit: Heb nu niet zo veel te doen dus hang een beetje op de fora :D

[ Voor 8% gewijzigd door Twazerty op 17-10-2011 18:01 ]

Ruisende versterker: schakel je subwoofer in.

Pagina: 1