2015-03-04 19 views
18

Ho uno strano problema. Ho un'app che ho distribuito su un dispositivo Android 4.4 e uso la libreria Otto. Ho distribuito l'app su un dispositivo Android 5.0. Funziona ancora. Ho ritentato sulla 4.4 e l'app non verrà avviata.ClassNotFoundException: Non ho trovato la classe "android.os.PersistableBundle" Otto Android 5.0

Apparentemente, tenta di utilizzare PersistableBundle.class quale classe API 21. Qui il mio registro:

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.os.PersistableBundle" on path: DexPathList[[zip file "/data/app/fr.myapp.apk"],nativeLibraryDirectories=[/data/app-lib/fr.myapp, /vendor/lib, /system/lib]] 
      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:497) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:457) 
            at java.lang.Class.getDeclaredMethods(Native Method) 
            at java.lang.Class.getDeclaredMethods(Class.java:656) 
            at com.squareup.otto.AnnotatedHandlerFinder.loadAnnotatedMethods(AnnotatedHandlerFinder.java:52) 
            at com.squareup.otto.AnnotatedHandlerFinder.findAllProducers(AnnotatedHandlerFinder.java:126) 
            at com.squareup.otto.HandlerFinder$1.findAllProducers(HandlerFinder.java:33) 
            at com.squareup.otto.Bus.register(Bus.java:191) 
+0

Non sono sicuro se tu sei quella che ha commentato sulla questione, ma c'è [una questione in sospeso su questo] (https://github.com/square/otto/issues/139). – CommonsWare

+0

Sì, sono io. Ho appena trovato la soluzione qui sotto. – Cocorico

+0

aggiornamento android os a 5.0 risolto il problema per me –

risposta

28

trovo la "soluzione". rimuovere Proprio questa funzione dalla vostra attività:

@Override 
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
    super.onSaveInstanceState(outState, outPersistentState); 
} 
+0

Rimuovere da cosa? – CommonsWare

+0

Ho modificato la mia risposta. Spero che aiuti – Cocorico

+4

Hmmm ... mentre probabilmente funziona, è davvero una soluzione alternativa più che una "soluzione". Gli sviluppatori potrebbero voler utilizzare tale metodo su dispositivi Android 5.0 e versioni successive. Sostituire un metodo che un livello API precedente non chiama normalmente non è un problema. Otto, come è iterating sui metodi, dovrebbe avere una gestione delle eccezioni in atto per affrontare questo scenario, IMHO. – CommonsWare

0

Change targetVersion alla versione API del dispositivo che si sta eseguendo.

Ho avuto targetVersion = 21 quando il dispositivo ha 4.4 (API 19), cambiando il valore di 19 risolto il problema.

0

Ho avuto lo stesso problema su Samsung Galaxy 3mini e sui telefoni degli operatori locali. Ma ho risolto il problema con il metodo di attività override. Spero che funzioni per voi.

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    try { 
     BusApplication.getInstance().register(this); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
}