2012-02-27 15 views
27

Sto ricevendo segnalazioni di crash da Android Marketplace:Risorse NotFoundException?

android.content.res.Resources$NotFoundException: Resource ID #0x.... 

ricevo circa 17 di questi una settimana. Mi sta indicando quanto segue nel mio codice:

context.getResources().getDrawable(R.drawable.foo); 

Tale risorsa è sicuramente presente nella mia cartella/drawable. Ho diverse centinaia di migliaia di installazioni, non sono sicuro di come questo potrebbe non funzionare per alcuni utenti, ma di lavorare per la stragrande maggioranza. Mi piacerebbe scoprire cosa sta succedendo, perché non possono usare l'app in questo stato. Qualche idea?

Grazie

Aggiornamento --------- ----------------------

Inoltre mi può vedere il voce per il drawable in questione nel mio file R.java, si presenta come:

public static final int foo=0x7f020034; 

faccio una generazione pulita del progetto, poi subito dopo che il fare la mia build di rilascio (nessuna modifica il codice in mezzo per dare l'automatico il materiale di costruzione di eclipse potrebbe far sì che il file R non vada a buon fine)

+0

Questo può essere ovvio, ma hai selezionato "Crea automaticamente" in Eclipse? Se non usi Eclipse, hai rigenerato le classi di risorse dopo averle modificate? Puoi mostrarci la tua classe R? – m0skit0

+0

Ciao sì, ho "build automatically" checked, ma mi assicuro di fare una build pulita prima di ogni release. Posso vedere la voce di risorsa presente per quel drawable in R.java (incollato sopra) Grazie – user291701

+0

Non vedo nulla incollato, ma se dici che la voce è lì ... Il pacchetto mostrato in R è corretto (come la tua attività)? – m0skit0

risposta

10

I rapporti di arresto anomalo provengono dalla versione < = 1,6 e alcune risorse sono disponibili solo in cartelle qualificate, ad esempio "drawable-mdpi" anziché solo "drawable"? Se è così, leggi "Problemi noti" nella parte inferiore di this page.

+0

Ah dang ho alcune risorse in/drawable-mdpi e altre solo in/drawable. L'ho eseguito su un emulatore 1.6 per un po 'di tempo e non ho mai avuto alcun problema (il mio target minimo è 1.6, quindi gli utenti non dovrebbero nemmeno essere in grado di eseguire 1.5). Potrebbe essere? Non dovrebbe crollare anche sull'emulatore, allora? – user291701

+0

Sì, dovrebbe bloccarsi anche sull'emulatore. Sto usando io stesso un emulatore 1.6 per rintracciare questo tipo di bug. Se hai testato attentamente con l'emulatore, puoi escludere questo bug:/ – pgsandstrom

+0

Hmm sì, in realtà vedo ora che il marketplace sta dicendo che questo errore sta accadendo su Nexus One, Droid, poi su altri. Penso che Nexus One stia eseguendo il minimo 2.0, lo stesso per Droid. Argh. – user291701

2

Lo stesso problema riscontrato ieri mattina sulla mia applicazione e ho trovato una soluzione molto semplice. il problema sembra grande e complicato ma non lo è.

passaggi che ho seguito sono

  1. eliminare la cartella bin è di per sé
  2. Pulire il progetto
  3. applicazione rimuovere dal dispositivo
  4. Eseguire l'applicazione e verificare lo scenario.

Secondo me non dovrebbe dare di nuovo questa eccezione.

Motivo: quando si crea l'applicazione, R.java contiene tutto l'indirizzo di memoria e accade che tali indirizzi non siano validi per la prossima esecuzione.

Secondo motivo: quando si dispone dell'applicazione che supporta la modalità lanscape e portrati e se non si è scritto il file XML per nessuno di questi, è la possibilità che ciò possa portare a questo tipo di arresto anomalo. e ci sono molte possibilità di problemi di perdita di memoria e Outo quando devi supportare entrambe le modalità. per favore pensa anche a questo.

+0

Per me comunque - questo non è utile. Sto ottenendo questi rapporti di arresto anomalo da progetti dal vivo sull'app store. Non l'ho mai visto durante i test o il mio utilizzo della versione live utilizzando vari dispositivi (che sono gli stessi dispositivi/OS come alcuni dei report che sono stati inviati). Questo non sembra essere correlato a una risorsa/indirizzo specifico - per me - come ho visto i rapporti sugli arresti anomali quando ottengo tutti i tipi di risorse - ciò potrebbe essere causato dal sistema operativo che ha lanciato eccezioni OutOfMemory? Se è così, non ottengo OOM in crash/stack trace. –

+0

Ho modificato il mio ans. per favore dai un'occhiata –

+1

Quindi stai dicendo che questo potrebbe essere causato dal fatto che sto caricando un layout come main .... ad eccezione di questo layout NON è incluso nella cartella di layout standard invece è incluso all'interno di layout-normal-port , layout-large-port e layout-xlarge-port & land (ho impostato l'orientamento in modo che si adatti a uno di questi) - potrebbe essere perché i dispositivi non sono in grado di capire le proprie configurazioni e provare a prelevare la risorsa da la cartella di layout? 0- curiosamente sto vedendo alcune relazioni sui dispositivi su cui ho provato. –

2

Questo si è verificato più volte soprattutto sui telefoni con bassa densità. Ho anche notato che succede soprattutto con le immagini a 9 patch.

La mia soluzione è stata quella di includere immagini con 9 patch in tutte le cartelle di densità disponibili (mdpi, ldpi, hdpi, xdpi).

1

Heh, non ne ho idea, sto effettivamente lavorando su un problema simile, ma potrebbe essere. Vale la pena ricordare che mentre il dispositivo è in grado di aggiornare risorse e layout, non è possibile ridurli. Quindi se hai valori minimi, impostali in AndroidManifest.xml. Prova ad aggiungere prima layout-ldpi e layout-small.

Una tecnica utile per la registrazione quale layout ottenuto caricato è per collegare un android:tag ad ogni contenitore principale del file di layout XML, e in onCreate() dopo aver impostato setContentView(R.id.layout) Basta stampare il valore del tag. Ti dirà quale è stato caricato - devi ancora tappare il buco aggiungendo tutte le combinazioni possibili, se solo per scopi di debug.

inoltre, rinominare i drawable nella cartella drawables-nodpi per assicurarsi che non mancano i drawable. questo disattiva il ridimensionamento interno, rende gli APK più piccoli e non "preleva" da qualsiasi altra cartella drawable.

una volta capito se è il layout o disegnabile, le metriche aggiuntive ti aiuteranno a trovare la causa principale. per ora, controlla prima i layout con i drawable "usa sempre".

il lunedi quando torno in ufficio vi posterò il codice metriche utilizzate per misurare i dati acquisiti in questa discussione - Which part of Android is in charge of picking a correct resource profile?

1

Hai incluso alcuni codici che fanno riferimento a contenuti da Android SDK.

Per esempio, ho affrontato un problema simile, una volta e quando ho rimosso la linea

android:background="?android:attr/actionBarItemBackground" 

dal mio xml, tutto funziona ancora benissimo.

0

Questo potrebbe accadere anche se la risorsa a cui si fa riferimento (chiamiamola ResA) è a sua volta riferita a una risorsa mancante (chiamiamola ResB). Android aumenterà ResourceNotFoundException per ResA anche se ciò che manca è ResB. Così è la vita!

Nel mio caso, ResB è stato definito nei valori-swxxxdp ma non nei valori. Quindi stavo ottenendo questa eccezione sui telefoni ma non sui tablet.

36

ho avuto questa eccezione:

Resources$NotFoundException: String resource ID 

quando stavo usando setText con un valore int. Ho dovuto convertirlo in stringa.

Prima:

myTextView.setText(obj.SomeIntProperty);  

Dopo:

myTextView.setText(String.valueOf(obj.SomeIntProperty)); 
+0

"" + int farà anche il trucco – stefan

0

Nel mio caso ho avuto un file di layout che portano al crollo:

ho ottenuto il seguente log-

enter image description here

che ha mostrato questo link al mio codice vero e proprio:

enter image description here

Qual è questa riga di codice:

enter image description here

ho controllato i miei nomi delle cartelle di file navigatore come suggerito dalla risposta più popolare e sembrava che la risorsa che apparentemente manca sia nella normale cartella layout

enter image description here

ma quando guardando sotto il Project File Navigator piuttosto che il navigatore Android lima ho potuto vedere che non solo è stato il file di risorse presumibilmente mancanti non nel normale cartella di layout, ma io non avevo nemmeno una cartella layout senza un'estensione speciale.

enter image description here

Aggiunta di una directory di risorse di Android alla cartella res e chiamandolo layout e poi incollare sulle risorse dalla cartella specialità (es. layout-sw720dp) in esso risolto il problema per me.

enter image description here

Questa soluzione funziona anche per altre cartelle come suggerito come non avere i file in drawable e solo averli in drawable-xxhdpi può essere fissato spostando il file in drawable e tweaking in base alle esigenze. Buona fortuna per i folder folder!

0
  1. Vai al progetto> Clean ...
  2. Selezionare il progetto, quindi premere "OK".
  3. Riavvia l'app.
Problemi correlati