2015-06-16 9 views
10

Sto utilizzando Parse come backend per la mia app Android. Ho un rapporto di arresto anomalo solo per alcuni dispositivi Android quando provo a creare un oggetto Utente. L'errore sul crollo è:Errore anomalo durante la creazione dell'utente

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

I dispositivi che hanno presentato la relazione crash sono:

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 

Ciò è estremamente strano come ho attualmente testato il mio codice a Samsung Note 4, Galaxy S4, S5 e Nexus 5 senza problemi. Non sono sicuro del motivo per cui Parse mi stia chiedendo di creare una sottoclasse dal nulla in quanto non sto cercando di utilizzare la funzionalità sottoclasse offerta da Parse. Ancora una volta, ho testato questo codice su altri dispositivi senza problemi.

Qualcuno può dirmi come risolvere questo problema? Ho incluso il codice qui sotto dove creo l'utente e si blocca.

Grazie!

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

indovinare. alcuni ambienti di rete introducono un problema asincrono in cui init non restituisce e in qualche modo la seguente espressione cerca di ottenere un nuovo OBJ parse_user. che potrebbe causare l'errore msg .. Forse provare/prendere un timeout o qualcosa del genere ... –

+0

@RobertRowntree Ciao Robert, grazie per la risposta. Ho aggiunto altro codice che mostra come effettivamente invio l'oggetto User a Parse. In termini di ciò che hai suggerito, non dovrebbe essere il caso in quanto dovrebbe rilevare l'errore in base al mio codice ... corretto? Grazie ancora – Teddy13

+0

Hai qualche classe che estende ParseObject o ParseUser? –

risposta

2

Hai provato l'inizializzazione Parse utilizzando una classe Application come descritto da Parse guida rapida? Forse Parse non è stata inizializzata con successo

Creare una classe che estende l'applicazione, e per il contenuto:

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

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

Modificare il manifesto < applicazione> tag, aggiungere questo:

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> 

In questo modo, Parse verrà sempre inizializzato all'avvio dell'applicazione, indipendentemente dall'attività.

+0

Ciao Reid, grazie per la risposta. Sì, l'ho fatto e non penso che questo sia il problema, perché molti dei dispositivi che abbiamo e degli utenti funzionano senza problemi. Sono solo alcuni dispositivi. E l'errore non sta dicendo che il parse non è stato inizializzato correttamente, sta dicendo che non sto sottoclassi correttamente l'oggetto parse (menzionato nella parse di Android guide) che non è esattamente quello che sto cercando di fare. Qualche altro suggerimento? Grazie! – Teddy13

+0

puoi cercare la parte in cui istanzia ParseUser e poi controlla ParseException per qualsiasi codice di errore come spiegato nel documento https://parse.com/docs/android/api/com/parse/ParseException.html – reidzeibel

+0

quale versione di Parse lib e com.parse.bolts stai usando? – Phileo99

0

Hai aggiunto questi due comandi al vostro manifesto ?:

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

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

Nel mio progetto, ho avuto problemi reali che cercano di fare il metodo signupinbackground di lavorare, se lo desideri, e il modo in cui la vedo io non lo fai davvero bisogno della registrazione da fare sullo sfondo, dato che si dà una risposta immediata all'utente. Prova a fare in questo modo:

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

Si può provare a registrare la classe ParseUser prima di chiamare Parse.initialize(), in questo modo:

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

So che non c'è bisogno di fare questo, ma può essere un lavoro in giro per il tuo problema. Puoi testare e pubblicare i risultati!

Altrimenti puoi sempre cercare ulteriori informazioni con il team di analisi.

+0

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

+0

Ciao Clayton, grazie per la risposta. Sono confuso sul motivo per cui è necessario dal momento che non sto sottoclassi alcun oggetto Parse e che i documenti dicono che la sottoclasse è facoltativa. Sto solo usando la classe User Parse "built-in". Inoltre, l'arresto anomalo si verifica solo su alcuni dispositivi Android come menzionato sopra. Se questo fosse davvero necessario, perché non si blocca su ogni dispositivo? Grazie! – Teddy13

+0

Ciao @ Teddy13, hai ragione! la sottoclasse è facoltativa e non è necessario modificare il codice. Ma hai provato a registrare la classe ParseUser nella tua classe Application? può valere la pena;) –