2015-05-09 10 views
14

Quindi ho seguito le istruzioni dalla Guida Rapida dal sito Web Parse SDK. L'app funziona bene la prima volta. Ma quando minimizzo l'app ed eseguo di nuovo dal commutatore di attività, la forzatura si chiude.Errore Parse: Parse # enableLocalDatastore (Context) `deve essere richiamato prima di` Parse # initialize (Context) `

L'errore non ha alcun senso per me. Logcat -

05-09 08:57:40.611 19419-19419/com.example.shubhamkanodia.bookmybook E/CrashReporting﹕ ParseCrashReporting caught a RuntimeException exception for com.example.shubhamkanodia.bookmybook. Building report. 
05-09 08:57:40.626 19419-19419/com.example.shubhamkanodia.bookmybook E/CrashReporting﹕ Handling exception for crash 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.shubhamkanodia.bookmybook/com.example.shubhamkanodia.bookmybook.MainActivity}: java.lang.IllegalStateException: `Parse#enableLocalDatastore(Context)` must be invoked before `Parse#initialize(Context)` 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) 
      at android.app.ActivityThread.access$900(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.IllegalStateException: `Parse#enableLocalDatastore(Context)` must be invoked before `Parse#initialize(Context)` 
      at com.parse.Parse.enableLocalDatastore(Parse.java:104) 
      at com.example.shubhamkanodia.bookmybook.MainActivity.onCreate(MainActivity.java:21) 
      at android.app.Activity.performCreate(Activity.java:5990) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
            at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) 
            at android.app.ActivityThread.access$900(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5254) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Mainactivity.java

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if(!ParseCrashReporting.isCrashReportingEnabled()) 
      ParseCrashReporting.enable(this); 

     Parse.enableLocalDatastore(this); //Its already before initialize 
     Parse.initialize(this, "XXX", "XXX"); 
     ParseInstallation.getCurrentInstallation().saveInBackground(); 
     ParseAnalytics.trackAppOpenedInBackground(getIntent()); 
    } 

risposta

23

Si può avere una classe separata che fanno questa roba inizializzazione. Quindi creare una classe ParseApplication che si estende Application.

public class ParseApplication extends Application { 

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

     ParseCrashReporting.enable(this); 
     Parse.enableLocalDatastore(this); 
     Parse.initialize(this, "xxx", "xxx"); 
    } 
    } 

E in AndroidManifest.xml, aggiungere ParseApplication classe Application

<application 
     android:name="com.example.parsetry.ParseApplication" // you should replace this based on your package 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
+2

Ho lo stesso problema. Puoi spiegare come metterlo in una classe separata potrebbe influenzare il problema? – YumeApps

+1

Quando si inserisce l'inizializzazione in onCreate() di un'attività principale, questo funziona fintanto che questa attività suCreate() non viene richiamata. Il post sopra funziona non inserendo l'inizializzazione una tantum nell'Attività, ma nell'Applicazione che ha un ciclo di vita diverso (come mostrato qui: https://tinyurl.com/q4bqoex) e verrà chiamato una sola volta. (Lo stesso effetto potrebbe essere raggiunto usando un modello simile al singleton). –

+2

Penso che questa non sia una risposta risolutiva. Ho ottenuto lo stesso errore anche se ho abilitatoLocalDatastore e inizializzo (questo, "xxx", "xxx") nella funzione OnCreate nell'app – P1x