2013-05-24 19 views
6

Uzyskanie dziwnego błędu StackOverflow z UiLifecycleHelper. Wygląda na to, że próbuje załadować obiekt serializowany, ale obiekt ObjectInputStream uruchamia się w pętli rekursywnej, prawdopodobnie z powodu uszkodzonych danych. Dzieje się tak tylko w metodzie onCreate. Oto ślad stosuFacebook Android SDK, UiLifecycleHelper StackOverflow error

Aktualizacja

StackOverflowError faktycznie występuje również w stanie onSaveInstance, ale pętle pisze ObjectStream. Mamy tylko 4 dzienniki awarii pokazujące to, z 49 dziennikami awarii na odczyt w onCreate. Oto kod, który jest używany:

UiHelper jest wywoływany we wszystkich oczekiwanych metodach, onCreate, onResume, onPause, onSaveInstanceState, onDestroy bez zbaczania z dokumentów. Cały inny kod Facebooka jest pokazany poniżej.

//onClick facebook button 
private void facebook() { 
    Session session = Session.getActiveSession(); 
    if (session != null && session.isOpened()) { 
     Log.v("W", "Already have session"); 
     publishog(session); 
    } else { 

     Session.openActiveSession(WWhisperActivity.this, true, callback); 
    } 
} 

private void onSessionStateChange(Session session, SessionState state, 
     Exception e) { 
    if (e != null && !e.getLocalizedMessage().contains("user denied")) { 
     BugSenseHandler.sendException(e); 
    } 
    if (state.equals(SessionState.OPENING)) { 
     Log.v("W", "Session opening state"); 
    } else if (state.equals(SessionState.CREATED) 
      || state.equals(SessionState.CREATED_TOKEN_LOADED)) { 
     Log.v("W", "Session created state"); 
    } 
    if (state.isOpened()) { 
     Log.v("W", "Open session"); 
     if (!session.getPermissions().contains("publish_actions")) { 
      Log.v("W", "Getting publish permission"); 
      Session.NewPermissionsRequest r = new Session.NewPermissionsRequest(
        this, Arrays.asList("publish_actions")); 
      session.requestNewPublishPermissions(r); 
     } else { 
      Log.v("W", "Session opened, publishing og"); 
      publishog(session); 
     } 
    } else if (state.equals(SessionState.CLOSED) 
      || state.equals(SessionState.CLOSED_LOGIN_FAILED)) { 
     Log.v("W", "Session not open"); 
     session.closeAndClearTokenInformation(); 
     if (state.equals(SessionState.CLOSED_LOGIN_FAILED)) { 
      if (e == null || !e.getLocalizedMessage().contains("abort") 
        && !e.getLocalizedMessage().contains("user denied")) 
       Session.openActiveSession(this, true, callback); 
     } 
    } 
} 

private void publishog(Session session) { 
    Log.v("W", "Publishing OG"); 
    WObject wo = GraphObject.Factory.create(WObject.class); 
    wo.setId(w.wid); 
    wo.setUrl(shorturl); 
    WOGShare ws = GraphObject.Factory.create(WOGShare.class); 
    ws.setWhisper(shorturl); 
    com.facebook.Request.executePostRequestAsync(session, 
      "me/whisper_app:share", ws, 
      new com.facebook.Request.Callback() { 

       @Override 
       public void onCompleted(Response response) { 
        pd.dismiss(); 
        if (response.getError() != null) { 

        } else { 

        } 

       } 

      }); 
} 

Rejestr awarii:

java.lang.StackOverflowError 
1at java.lang.ThreadLocal.get(ThreadLocal.java:65) 
2at java.io.ObjectStreamClass.getCache(ObjectStreamClass.java:1093) 
3at java.io.ObjectStreamClass.lookupStreamClass(ObjectStreamClass.java:1066) 
4at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:1037) 
5at java.io.ObjectStreamClass.createClassDesc(ObjectStreamClass.java:248) 
6at java.io.ObjectStreamClass.lookupStreamClass(ObjectStreamClass.java:1069) 
7at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:1037) 
8at java.io.ObjectStreamClass.createClassDesc(ObjectStreamClass.java:248) 
9at java.io.ObjectStreamClass.lookupStreamClass(ObjectStreamClass.java:1069) 
10at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:1037) 
11at java.io.ObjectStreamClass.createClassDesc(ObjectStreamClass.java:248) 
12at java.io.ObjectStreamClass.lookupStreamClass(ObjectStreamClass.java:1069) 
13at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2375) 
14at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1662) 
15at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683) 
16at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803) 
17at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
18at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
19at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
20at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
21at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
22at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
23at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
24at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
25at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
26at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
27at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
28at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
29at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
30at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
31at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
32at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
33at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
34at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
35at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
36at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
37at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
38at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
39at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
40at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
41at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
42at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
43at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
44at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
45at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
46at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
47at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
48at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
49at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
50at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
51at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
52at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
53at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
54at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
55at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
56at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
57at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
58at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
59at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
60at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
61at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
62at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
63at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
64at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
65at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
66at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
67at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
68at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
69at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
70at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
71at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
72at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
73at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
74at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
75at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
76at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1137) 
77at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
78at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
79at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
325at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
326at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1369) 
327at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 
328at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 
329at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 
330at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
331at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
332at com.facebook.Session.restoreSession(Session.java:701) 
333at com.facebook.UiLifecycleHelper.onCreate(UiLifecycleHelper.java:70) 
334at sh.whisper.WWhisperActivity.onCreate(WWhisperActivity.java:279) 
335at android.app.Activity.performCreate(Activity.java:5160) 
336at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
337at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
338at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
339at android.app.ActivityThread.access$700(ActivityThread.java:143) 
340at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241) 
341at android.os.Handler.dispatchMessage(Handler.java:99) 
342at android.os.Looper.loop(Looper.java:137) 
343at android.app.ActivityThread.main(ActivityThread.java:4953) 
344at java.lang.reflect.Method.invokeNative(Native Method) 
345at java.lang.reflect.Method.invoke(Method.java:511) 
346at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
347at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 

348at dalvik.system.NativeStart.main(Native Method) 
+0

Zamieść swój kod? Możliwe, że próbujesz uruchomić żądanie otwarte ręcznie lub coś, podczas gdy uiHelper automatycznie uruchamia inne żądanie z powodu zmiany stanu sesji. – Wenger

+0

Wysłane, nie udało się zreplikować przepływu StackOverflow –

+0

Czy ktoś jeszcze to widział? Zdarza się to dość często w naszej aplikacji. –

Odpowiedz

1

Parametry i zmienne lokalne są alokowane na stosie (z typów referencyjnych obiektu mieszka na stercie i zmiennej odniesienia że Object). Stos zwykle znajduje się na górnym końcu przestrzeni adresowej użytkownika, a ponieważ jest zużyty, kieruje się w stronę dolnej przestrzeni adresowej adresu IP (czyli w kierunku zera).

gui programowanie możliwe jest generowanie pośredniej rekursji. Dla przykładu, Twoja aplikacja może obsługiwać komunikaty o malowaniu i podczas przetwarzania może wywoływać funkcję powodującą wysłanie przez system kolejnej wiadomości malowania . Tutaj nie nazywasz się jawnie, ale system OS/VM zrobił to za Ciebie.

jakie napotkał ten sam błąd before.Do jedno tylko usunąć inicjalizacji bezpośrednio poniżej klasy i przenieść go wewnątrz onCreate() lub onResume().

+0

Zrobiłem tylko to. Wygląda na to, że * zmniejszyło * wystąpienie awarii, ale nie zostało wyeliminowane. Ponadto, ten StackOverflow nie jest generowany z powodu pętli GUI, jest to spowodowane pętlą Serialized Object, prawdopodobnie z powodu pętli uprawnień żądania lub możliwego problemu z niejawnie zdefiniowanymi typami interfejsu JSON Facebooka. –

Powiązane problemy