2015-03-04 19 views
18

Mam dziwny problem. Mam aplikację, którą zainstalowałem na urządzeniu z Androidem 4.4 i używam biblioteki Otto. Zainstalowałem aplikację na urządzeniu z Androidem 5.0. To nadal działa. Próbowałem ponownie na 4.4, a aplikacja nie uruchomiła się.ClassNotFoundException: Nie znaleziono klasy "android.os.PersistableBundle" Otto Android 5.0

Podobno próbuje użyć klasy PersistableBundle.class, która jest klasą API 21. Tutaj mój dziennik:

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

Nie jestem pewien, czy jesteś tym, który wypowiedział się na temat problemu, ale jest [wybitnym problemem w tej sprawie] (https://github.com/square/otto/issues/139). – CommonsWare

+0

Tak, to ja. Właśnie znalazłem rozwiązanie poniżej. – Cocorico

+0

aktualizacja systemu operacyjnego Android do wersji 5.0 rozwiązała problem –

Odpowiedz

28

Znajduję "rozwiązanie". Wystarczy usunąć tę funkcję od swojej aktywności:

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

Usunąć z czego? – CommonsWare

+0

Edytowałem swoją odpowiedź. Mam nadzieję, że to pomoże – Cocorico

+4

Hmmm ... podczas gdy to prawdopodobnie działa, to jest naprawdę rozwiązanie bardziej niż "rozwiązanie". Programiści mogą chcieć użyć tej metody na urządzeniach z Androidem 5.0 i nowszym. Przesłanianie metody, której starszy interfejs API nie wywołuje normalnie, nie stanowi problemu. Otto, jako że iteruje metody, powinien mieć obsługę wyjątków, aby poradzić sobie z tym scenariuszem, IMHO. – CommonsWare

0

Zmień targetVersion wersji API urządzenia używasz.

Posiadałem targetVersion = 21, gdy moje urządzenie miało 4.4 (API 19), zmiana wartości na 19 rozwiązała problem.

0

Miałem ten sam problem na Samsung Galaxy 3mini i lokalny telefon operatora.Jednakże naprawiłem to przy pomocy metody override activity.i mam nadzieję, że to zadziała.

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