Autore Topic: Errore di cast bizzarro  (Letto 2427 volte)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Errore di cast bizzarro
« il: 24 Luglio 2012, 17:11:49 CEST »
0
Salve a tutti,

come al solito sono di fronte ad un problema bizzarro  o_O

Il problema è legato ad una ListView popolata tramite un adapter personalizzato basato sul codice di Ricky`.

A differenza di questo, però, nella getView invece di valorizzare direttamente le view chiama un altro metodo, bindData, che si occupa di farlo a posto suo (vedi codice sotto).

Questo adapter renderizza un insieme di array. Per capirci è un ArrayAdapter<RollResult[]>.

Tutto funziona egregiamente ma occasionalmente (mi è successo una volta sul cellulare e da pannello di controllo ho un paio di segnalazioni) si solleva un'eccezione di cast non valido quando l'app torna in primo piano:


java.lang.ClassCastException: java.lang.Object[] cannot be cast to ohm.quickdice.entity.RollResult[]
at ohm.quickdice.adapter.ResultListAdapter.bindData(ResultListAdapter.java:63)
at ohm.library.adapter.CachedArrayAdapter.getView(CachedArrayAdapter.java:75)
at android.widget.AbsListView.obtainView(AbsListView.java:2046)
at ... (omissis)


il codice incriminato: CachedArrayAdapter.getView
Codice (Java): [Seleziona]
        public View getView(int position, View convertView, ViewGroup parent) {

                ViewCache viewCache;

                if (convertView == null) {
                        convertView = mInflater.inflate(mViewId, null);
                        viewCache = createCache(position, convertView);
                        convertView.setTag(viewCache);
                } else {
                        viewCache = (ViewCache)convertView.getTag();
                }

                viewCache.position = position;
                viewCache.data = getItem(position);

                bindData(viewCache); //Questa è la riga 75

                return convertView;
        }

L'altra parte incriminata: ResultListAdapter.bindData
Codice (Java): [Seleziona]
        protected void bindData(ViewCache viewCache) {
                ExpViewCache cache = (ExpViewCache)viewCache;

                bindData(
                                getContext(),
                                (RollResult[])cache.data; //Questa è la riga 63
                                cache.diceIcon,
                                cache.name,
                                cache.resultText,
                                cache.resultValue,
                                cache.resultIcon);
        }


La cosa strana del messaggio è che indica chiaramente che "un array di Object non può essere convertito in un array di RollResult". Ma so per certo che ExpViewCache.data è nullo o è un array di RollResult (per via del viewCache.data = getItem(position);) chiamato subito prima del bindData, per cui come è possibile che venga sollevata quell'eccezione?

E' possibile che in qualche condizione java si "dimentichi" il tipo dell'array? Oppure l'errore viene sollevata quando ExpViewCache.data è nullo?

Purtroppo non posso allegare logcat perché come detto l'errore si verifica molto raramente quando l'applicazione viene riportata in primo piano (forse c'entra la serializzazione?).

Ogni aiuto è gradito.

Grazie! (e scusate se sono stato poco chiaro)
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Errore di cast bizzarro
« Risposta #1 il: 24 Agosto 2012, 15:46:21 CEST »
0
Manca troppo codice per poter capire il tuo errore a cosa si riferisce, ma possiamo rispondere in ogni caso ad alcune delle tue domande:

La cosa strana del messaggio è che indica chiaramente che "un array di Object non può essere convertito in un array di RollResult". Ma so per certo che ExpViewCache.data è nullo o è un array di RollResult (per via del viewCache.data = getItem(position);) chiamato subito prima del bindData, per cui come è possibile che venga sollevata quell'eccezione?

Dal codice che hai postato sappiamo sicuramente che viewCache è diverso da null, ma nulla possiamo dire di viewCache.data. Infatti noi possiamo solo vedere che il suo contenuto proviene da getItem(position), ma quella funzione può benissimo restituire null, un array pieno o un array vuoto. Inoltre, non vedendo la firma del metodo, non possiamo dire nulla nemmeno sul Tipo restituito. Dovresti almeno postare il codice di getItem per capire di più.

E' possibile che in qualche condizione java si "dimentichi" il tipo dell'array? Oppure l'errore viene sollevata quando ExpViewCache.data è nullo?

Java non dimentica.
null è castabile con tutto.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Errore di cast bizzarro
« Risposta #2 il: 26 Agosto 2012, 18:29:07 CEST »
0
Ciao MarcoDuff, grazie per l'intervento.

Il metodo getItem(position) è definito nella classe ArrayAdapter<T>. La guida non è chiara, ma dovrebbe restituire l'I-esimo elemento dell'array associato all'adapter. Restituisce un elemento di tipo "T", che nel mio caso è un "RollResult[]". Oppure, ovviamente, null, ma come dici tu null è castabile con tutto.

Il mio dubbio è: è possibile che invece di restituire un array di RollResult (ossia RollResult[]) restituisca un array di oggetti (ossia Object[])? Ha senso quello che dico? Se sì: dove sbaglio? Se no: come è possibile che venga sollevata quell'eccezione?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Errore di cast bizzarro
« Risposta #3 il: 26 Agosto 2012, 19:51:33 CEST »
0
Com'é definito il campo data di ViewCache?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Errore di cast bizzarro
« Risposta #4 il: 26 Agosto 2012, 19:58:04 CEST »
0
E' di tipo "Object".
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Errore di cast bizzarro
« Risposta #5 il: 26 Agosto 2012, 21:32:53 CEST »
0
Converrebbe che tu postassi un po' più di codice.
In ogni caso, il tuo ArrayAdapter gestisce un array di array di tipo RollResult? Cioè tu hai ArrayAdapter<RollResult[]>?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Errore di cast bizzarro
« Risposta #6 il: 26 Agosto 2012, 21:40:58 CEST »
0
In ogni caso, il tuo ArrayAdapter gestisce un array di array di tipo RollResult? Cioè tu hai ArrayAdapter<RollResult[]>?

Esatto, come già scritto nel primo post.

Visto che chiedete, posto.

Codice (Java): [Seleziona]
public abstract class CachedArrayAdapter<T> extends ArrayAdapter<T> {

        private LayoutInflater mInflater;
        private int mViewId;

        /**
         * Class to cache an item's {@link View}s and data.
         * @author Ohmnibus
         */

        protected abstract class ViewCache {
               
                View baseView;
                public int position;
                public Object data;

                /**
                 *
                 * @param position Element position.
                 * @param baseView Parent view defining the list element.
                 */

                public ViewCache(View baseView) {
                        this.baseView = baseView;
                        findAllViews(this.baseView);
                }
               
                /**
                 * Implementation of this abstract method should perform all needed
                 * baseView.findViewById() and store resulting reference to appropriate
                 * public fields.
                 * @param baseView {@link View} defining a list element.
                 */

                protected abstract void findAllViews(View baseView);
        }

        /**
         * Default constructor.
         * @param context Current context
         * @param resourceId Resource ID of the layout defining a {@link ListView} element.
         * @param objects Object list, or null, if you like to indicate an empty.
         */

        public CachedArrayAdapter(Context context, int resourceId, List<T> objects) {
                super(context, resourceId, objects);
               
                mInflater = LayoutInflater.from(context);
                mViewId = resourceId;
        }

        @SuppressWarnings("unchecked")
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

                ViewCache viewCache;

                if (convertView == null) {
                        convertView = mInflater.inflate(mViewId, null);
                        viewCache = createCache(position, convertView);
                        convertView.setTag(viewCache);
                } else {
                        viewCache = (ViewCache)convertView.getTag();
                }

                viewCache.position = position;
                viewCache.data = getItem(position);

                bindData(viewCache);

                return convertView;
        }
       
        @SuppressWarnings("unchecked")
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
               
                ViewCache viewCache;

                if (convertView == null) {
                        convertView = mInflater.inflate(mViewId, null);
                        viewCache = createCache(position, convertView);
                        convertView.setTag(viewCache);
                } else {
                        viewCache = (ViewCache)convertView.getTag();
                }

                viewCache.position = position;
                viewCache.data = getItem(position);

                bindDropDownData(viewCache);

                return convertView;
        }

        /**
         * Creates your custom cache, that carries reference for e.g. ImageView
         * and/or TextView. If necessary connect your clickable View object with the
         * PrivateOnClickListener, or PrivateOnLongClickListener
         *
         * @param convertView The view for the new cache object.
         */

        protected abstract ViewCache createCache(int position, View convertView);

        /**
         * Binds the data from user's object to the cached {@link View}s.
         * @param viewCache Cache of {@link View}s that shall represent the data object.
         */

        protected abstract void bindData(ViewCache viewCache);

        /**
         * Binds the data from user's object to the cached {@link View}s.
         * @param viewCache Cache of {@link View}s that shall represent the data object.
         */

        protected abstract void bindDropDownData(ViewCache viewCache);

}

Codice (Java): [Seleziona]
public class ResultListAdapter extends CachedArrayAdapter<RollResult[]> {

        static TypedArray resultFontSizes;

        /**
         * This class contain all the variable view of a single item in a result list item.
         * @author Ohmnibus
         *
         */

    private class ExpViewCache extends ViewCache  {

                ImageView diceIcon;
                TextView resultValue;
                TextView name;
                TextView resultText;
                ImageView resultIcon;
               
                public ExpViewCache(View baseView) {
                        super(baseView);
                }

                @Override
                protected void findAllViews(View baseView) {
                        //baseView.setBackgroundResource(android.R.drawable.list_selector_background);
                        name = (TextView) baseView.findViewById(R.id.riName);
                        resultText = (TextView) baseView.findViewById(R.id.riResultText);
                        resultValue = (TextView) baseView.findViewById(R.id.riResult);
                        diceIcon = (ImageView) baseView.findViewById(R.id.riImage);
                        resultIcon = (ImageView) baseView.findViewById(R.id.riResultIcon);
                }
        }

    public ResultListAdapter(Context context, int resourceId, List<RollResult[]> objects) {
                super(context, resourceId, objects);
        }

        @Override
        protected ViewCache createCache(int position, View convertView) {
                ExpViewCache cache = new ExpViewCache(convertView);
                return cache;
        }

        @Override
        protected void bindData(ViewCache viewCache) {
                ExpViewCache cache = (ExpViewCache)viewCache;
                RollResult[] resList = null;
                //HACK: Curiously the cast "(RollResult[])cache.data" sometimes throw an exception
                //java.lang.ClassCastException: java.lang.Object[] cannot be cast to ohm.quickdice.entity.RollResult[]
                if (cache.data != null && cache.data instanceof RollResult[]) {
                        resList = (RollResult[])cache.data;
                }
                bindData(
                                getContext(),
                                resList,
                                cache.diceIcon,
                                cache.name,
                                cache.resultText,
                                cache.resultValue,
                                cache.resultIcon);
        }

        @Override
        protected void bindDropDownData(ViewCache viewCache) {
                bindData(viewCache);
        }
       
        public static void bindData(
                        Context context,
                        RollResult[] resList,
                        ImageView diceIcon,
                        TextView name,
                        TextView resultText,
                        TextView resultValue,
                        ImageView resultIcon) {
               
                RollResult res = RollResult.mergeResultList(resList);

                if (res != null) {
                        QuickDiceApp app = (QuickDiceApp)context.getApplicationContext();
                        diceIcon.setImageDrawable(app.getDiceIcon(res.getResourceIndex()));
                        name.setText(res.getName());
                        resultText.setText(res.getResultText());
                        String result = Long.toString(res.getResultValue());
                        resultValue.setText(result);
                        resultValue.setTextSize(TypedValue.COMPLEX_UNIT_DIP, getFontSize(context, result));
                        resultIcon.setImageResource(res.getResultIconID());
                } else {
                        diceIcon.setImageDrawable(null);
                        name.setText("");
                        resultText.setText("");
                        resultValue.setText("");
                        resultIcon.setImageDrawable(null);
                }
        }
       
        protected static float getFontSize(Context context, long result) {
                return getFontSize(context, Long.toString(result));
        }
       
        protected static float getFontSize(Context context, String result) {
                float retVal;
               
                if (resultFontSizes == null) {
                        resultFontSizes = context.getResources().obtainTypedArray(R.array.roll_result_font_size);
                }
               
                if (result.length() < resultFontSizes.length()) {
                        retVal = resultFontSizes.getInt(result.length(), 12);
                } else {
                        retVal = resultFontSizes.getInt(resultFontSizes.length() - 1, 12);
                }

                return retVal;
        }

}

Dove appare "HACK" ho messo un controllo nel tentativo di risolvere il problema, ma non sono sicuro che funzioni.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Errore di cast bizzarro
« Risposta #7 il: 26 Agosto 2012, 22:32:20 CEST »
0
Update curioso:

Ho ricevuto un'altra segnalazione. La stessa eccezione si è sollevata in un'altra parte del codice, che non c'entra nulla col precedente:

Codice (Java): [Seleziona]
ArrayList<RollResult[]> resultList;
RollResult[] nextItem;

resultList = [corretta istanza di ArrayList<RollResult[]>]

...

int index;

index = 1;

if (index + 1 < resultList.size()) {
        nextItem = resultList.get(index + 1); //Questa riga solleva l'eccezione
} else {
        nextItem = null;
}

Come fa "nextItem = resultList.get(int);" a sollevare l'eccezione java.lang.ClassCastException?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Errore di cast bizzarro
« Risposta #8 il: 27 Agosto 2012, 11:27:12 CEST »
0
Posti lo stacktrace di quest'ultimo errore?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Errore di cast bizzarro
« Risposta #9 il: 27 Agosto 2012, 13:30:18 CEST »
0

Ecco lo stacktrace. Se serve altro fatemi sapere.

Comunque non riesco ad immaginare una situazione in cui "nextItem = resultList.get(int);" sollevi un ClassCast exception, essendo resultList un "ArrayList<RollResult[]>" e nextItem un "RollResult[]". Avrebbe senso un null reference o un index out of bound tutto al più...

Codice: [Seleziona]
java.lang.ClassCastException: java.lang.Object[] cannot be cast to ohm.quickdice.entity.RollResult[]
at ohm.quickdice.activity.QuickDiceActivity.setupRollMenu(QuickDiceActivity.java:575)
at ohm.quickdice.activity.QuickDiceActivity.onCreateContextMenu(QuickDiceActivity.java:459)
at android.view.View.createContextMenu(View.java:6229)
at com.android.internal.view.menu.ContextMenuBuilder.show(ContextMenuBuilder.java:81)
at com.android.internal.policy.impl.PhoneWindow$DecorView.showContextMenuForChild(PhoneWindow.java:2292)
at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:564)
at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:564)
at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:564)
at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:564)
at android.widget.AbsListView.performLongPress(AbsListView.java:2772)
at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:2717)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4514)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Errore di cast bizzarro
« Risposta #10 il: 27 Agosto 2012, 13:48:24 CEST »
0
Posti tutto il codice della classe QuickDiceActivity indicando quale è la riga 575

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Errore di cast bizzarro
« Risposta #11 il: 27 Agosto 2012, 14:01:11 CEST »
0
Posti tutto il codice della classe QuickDiceActivity indicando quale è la riga 575

Non vorrei sembrare brusco, ma no.

A questo punto mi basterebbe sapere in quali casi "ArrayList<T>.get(int)" può sollevare un'eccezione di tipo "ClassCastException". Secondo la mia modesta conoscenza del Java la risposta è "mai", ma è questo che accade.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Errore di cast bizzarro
« Risposta #12 il: 27 Agosto 2012, 14:06:12 CEST »
0
A questo punto mi basterebbe sapere in quali casi "ArrayList<T>.get(int)" può sollevare un'eccezione di tipo "ClassCastException". Secondo la mia modesta conoscenza del Java la risposta è "mai", ma è questo che accade.

In nessun caso, per questo sono convinto che ci sia un errore nel codice.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 616
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Errore di cast bizzarro
« Risposta #13 il: 27 Agosto 2012, 14:10:00 CEST »
0
Può dipendere da come l'array viene serializzato e deserializzato nel e dal Bundle?

Mi spiego.

ho fatto l'override di onSaveInstanceState per salvare le informazioni sullo stato dell'app:

Codice (Java): [Seleziona]
        @Override
        protected void onSaveInstanceState(Bundle outState) {
                outState.putSerializable(KEY_LAST_ROLL, lastResult);
                outState.putSerializable(KEY_ROLL_LIST, resultList);
                super.onSaveInstanceState(outState);
        }
ed ovviamente questo Bundle lo deserializzo nell' onCreate:

Codice (Java): [Seleziona]
    @SuppressWarnings("unchecked")
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

...

        if (savedInstanceState != null) {
                Serializable tmp;
                tmp = savedInstanceState.getSerializable(KEY_LAST_ROLL);
                if (tmp instanceof RollResult[]) {
                        lastResult = (RollResult[])tmp;
                }
                tmp = savedInstanceState.getSerializable(KEY_ROLL_LIST);
                if (tmp instanceof ArrayList<?>) {
                        resultList = (ArrayList<RollResult[]>)tmp;
                }
        } else {
                //Non importante
        }
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Errore di cast bizzarro
« Risposta #14 il: 27 Agosto 2012, 14:15:03 CEST »
0
Codice: [Seleziona]
Tra le cose che possono venirmi in mente (ma attenzione vado molto di fantasia, ma con tutti i bug del framework android molto spesso di fantasia ci si azzecca) è che in qualche modo android non riesce a costruire il contextmenu (o trova un context menu vuoto) e quindi crea un fittizio Object[0] ed in quel caso ti va in errore.

In questo caso, l'errore nel codice va ricercato anche nella costruzione del context menu e non nel problema finale del casting.

[quote author=Ohmnibus link=topic=8173.msg47107#msg47107 date=1346069400]
Può dipendere da come l'array viene serializzato e deserializzato nel e dal [tt]Bundle[/tt]?

Non penso, se tutto è serializzabile non dovrebbero esserci problemi (anche se quel "tmp instanceof ArrayList<?>" non mi piace molto).