2015-06-16 15 views
10

Używam narzędzia Parse jako mojego zaplecza dla mojej aplikacji na Androida. Mam raport awarii dotyczący tylko niektórych urządzeń z Androidem, gdy próbuję utworzyć obiekt użytkownika. Błąd na temat katastrofy jest:Przyczyna awarii podczas tworzenia użytkownika

Caused by: java.lang.IllegalArgumentException: 
You must register this ParseObject subclass before instantiating it. 
at com.parse.ParseObject.<init>(ParseObject.java:184) 

urządzeń, które złożyło zgłoszenie awarii są:

HTC Desire 510 (htc_a11ul) 2 33.3% Android 4.4 
Xperia E3 (D2203) 1 16.7% Android 4.4 
Galaxy S4 (jflte) 1 16.7% Android 4.4 
Galaxy S5 (klte) 1 16.7% Android 4.4 

Jest to bardzo dziwne, jak ja obecnie testowałem mój kod na Samsung Note 4, Galaxy S4, S5 i Nexus 5 bez żadnych problemów. Nie jestem pewien, dlaczego Parse prosi mnie o subklasy znikąd, ponieważ nie próbuję korzystać z funkcji podklasy oferowanych przez Parse. Ponownie przetestowałem ten kod na innych urządzeniach bez żadnych problemów.

Czy ktoś może mi powiedzieć, jak to naprawić? Zawarłem poniższy kod, w którym utworzę użytkownika i ulega on awarii.

Dziękujemy!

Parse.initialize(this, "XXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXX"); 
    ParseUser user = new ParseUser(); 
    user.setUsername(email); 
    user.setPassword(confirmPassword); 
    user.setEmail(email); 
    user.put("deviceID", deviceID); 
    user.put("name", fullName); 

    progress = new ProgressDialog(Register.this); 
    progress.setMessage("Creating Account... Please Wait"); 
    progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progress.setIndeterminate(true); 
    progress.setCanceledOnTouchOutside(false); 
    progress.setCancelable(false); 
    progress.show(); 


    user.signUpInBackground(new SignUpCallback() { 
     public void done(ParseException e) { 
      if (e == null) { 
       // Hooray! Let them use the app now. 
       Intent i = new Intent(Register.this, DeviceSettingsIntro.class); 
       startActivity(i); 
       progress.hide(); 
       btnRegister.setEnabled(true); 
      } else { 
       // Sign up didn't succeed. Look at the ParseException 
       // to figure out what went wrong 
       progress.hide(); 
       checkParseError(e); 
       btnRegister.setEnabled(true); 
      } 
     } 
    }); 
+0

dzikie domysły. niektóre środowiska sieciowe wprowadzają problem asynchroniczny, w którym init nie zwraca i jakoś następujące wyrażenie próbuje uzyskać nowy OBJ parse_user. to może spowodować błąd msg .. Może spróbować/złapać timeout lub coś ... –

+0

@RobertRowntree Cześć Robert, dziękuję za odpowiedź. Dodałem więcej kodu pokazujący, w jaki sposób faktycznie wysyłam obiekt użytkownika do analizy. Pod względem tego, co zasugerowałeś, nie powinno tak być, ponieważ powinien złapać błąd w oparciu o mój kod ... poprawny? Jeszcze raz dziękuję – Teddy13

+0

Czy masz jakieś klasy, które rozszerza ParseObject lub ParseUser? –

Odpowiedz

2

Czy próbowałeś inicjowanie Parse stosując klasę Application jak opisał Parse skróconej instrukcji obsługi? Może Parse nie została zainicjowana pomyślnie

utworzyć klasę, która rozszerza aplikację, a za treść:

@Override 
public void onCreate() { 
    super.onCreate(); 

    Parse.enableLocalDatastore(this); //might not be needed 
    Parse.initialize(this, "xxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxx"); 
} 

edytować swój manifest < application> tag, dodać to:

android:name="com.yourpackage.applicationclass" 

//so it should look like (for example) : 
<application 
    android:name="com.yourpackage.yourapplicationclass" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    //put activities here 

</application> 

W ten sposób analiza składniowa będzie zawsze inicjowana podczas uruchamiania aplikacji, niezależnie od aktywności.

+0

Cześć Reid, dziękuję za odpowiedź. Tak, zrobiłem to i nie sądzę, że to jest problem, ponieważ wiele z naszych urządzeń i użytkowników pracuje bez problemu. To tylko niektóre urządzenia. I błąd nie oznacza, że ​​parsowanie nie zostało poprawnie zainicjalizowane, to znaczy, że nie piszę podklasy obiektu parsowania (wspomnianego w analizie Android), co nie jest tym, co próbuję w ogóle zrobić. Jakieś inne sugestie? Dzięki! – Teddy13

+0

możesz spróbować pobrać część, w której tworzysz ParseUser, a następnie sprawdzić wyjątek ParseException pod kątem kodu błędu, jak wyjaśniono w doc https://parse.com/docs/android/api/com/parse/ParseException.html – reidzeibel

+0

jaka wersja bibliotek Parse lib i com.parse.bolts używasz? – Phileo99

0

Dodano te dwa polecenia do manifestu ?:

<uses-permission android:name="android.permission.INTERNET"/> 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
0

W moim projekcie, miałem realne problemy próbuje zrobić metodę signupinbackground pracować jako pożądany, a Ja widzę to ty nie Naprawdę potrzebujesz rejestracji w tle, ponieważ dajesz natychmiastową odpowiedź użytkownikowi. Spróbuj zrobić tak:

try { 
user.signUp(); 
Intent i = new Intent(Register.this, DeviceSettingsIntro.class); 
startActivity(i); 
progress.hide(); 
btnRegister.setEnabled(true); 
} catch (ParseException e1) { 
progress.hide(); 
checkParseError(e1); 
btnRegister.setEnabled(true); 
} 
1

Można próbować zarejestrować klasę ParseUser przed wywołaniem Parse.initialize() w następujący sposób:

ParseObject.registerSubclass(ParseUser.class); 
Parse.initialize(); 

wiem, nie trzeba tego robić, ale może być pracą dla twojego problemu. Możesz testować i publikować wyniki!

W przeciwnym razie zawsze możesz poszukać informacji w zespole parsowania.

+0

http://stackoverflow.com/questions/27635352/you-must-register-this-parseobject-subclass-before-instantiating-it –

+0

Cześć Clayton, dziękuję za odpowiedź. Nie jestem zdezorientowany, dlaczego jest to potrzebne, ponieważ nie jestem podklasy żadnych obiektów Parse i doktorzy twierdzą, że podklasowanie jest opcjonalne. Używam tylko klasy "wbudowany" Parse User. Jak dobrze, awaria ma miejsce tylko na niektórych urządzeniach z Androidem, jak wspomniano powyżej. Jeśli było to rzeczywiście potrzebne, dlaczego nie awarie na każdym urządzeniu? Dzięki! – Teddy13

+0

Witam @ Teddy13, masz rację! Podklasowanie jest opcjonalne i nie powinieneś zmieniać kodu. Ale czy próbowałeś zarejestrować klasę ParseUser w swojej klasie aplikacji? może warto strzelać;) –