2016-05-17 20 views
0

Ich arbeite mit Parse SDK in Android Studio. Alles funktionierte gut, bis ich multidex in meinem Projekt aktiviert hatte, weil nach dem Hinzufügen der Kartenbibliotheken mein Projekt die 64K-Methodengrenze überschritt. Ich erhalte folgende Fehlermeldung, wenn ich meine app laufen:Parse sdk "java.lang.NoSuchMethodError". Konflikt zwischen Okhttp Bibliotheken

java.lang.NoSuchMethodError: com.squareup.okhttp.OkHttpClient.setFollowRedirects 
at com.parse.ParseOkHttpClient.<init>(ParseOkHttpClient.java:58) 
at com.parse.ParseHttpClient.createClient(ParseHttpClient.java:45) 
at com.parse.ParsePlugins$Android.newHttpClient(ParsePlugins.java:175) 
at com.parse.ParsePlugins.restClient(ParsePlugins.java:91) 
at com.parse.Parse.getEventuallyQueue(Parse.java:615) 
at com.parse.Parse.access$800(Parse.java:42) 
at com.parse.Parse$1.call(Parse.java:410) 
at com.parse.Parse$1.call(Parse.java:407) 
at bolts.Task$4.run(Task.java:357) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
at java.lang.Thread.run(Thread.java:856) 

Dies ist, wie meine gradle Datei wie folgt aussieht:

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.2" 

dexOptions { 
    javaMaxHeapSize "4g" 
} 

defaultConfig { 
    minSdkVersion 14 
    targetSdkVersion 23 
    versionCode 1 
    versionName "1.0" 
    multiDexEnabled true 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 
} 

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
testCompile 'junit:junit:4.12' 
compile 'com.github.clans:fab:1.6.2' 
compile 'com.google.android.gms:play-services:8.4.0' 
compile 'com.google.maps:google-maps-services:0.1.9' 
compile 'com.google.maps.android:android-maps-utils:0.4' 
compile 'com.balysv:material-ripple:1.0.2' 
compile 'com.android.support:cardview-v7:23.3.0' 
compile 'com.android.support:recyclerview-v7:23.3.0' 
compile 'com.android.support:design:23.3.0' 
compile 'com.android.support:appcompat-v7:23.3.0' 
compile 'com.android.support:multidex:1.0.1' 
compile('com.github.afollestad.material-dialogs:core:[email protected]') { 
    transitive = true 
} 
compile 'com.parse.bolts:bolts-android:1.4.0' 
compile 'com.parse:parse-android:1.13.0' 
} 

und das ist mein Manifest-Datei:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.rowburst.traverous.traverous"> 

<uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="23" /> 

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

<application 
    android:name="com.example.MyApplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="@string/MAPS_API_KEY" /> 

    <activity 
     android:name="com.example.LaunchingActivity" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.NoDisplay"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

    <activity 
     android:name="com.example.LoginActivity" 
     android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen" /> 

    <activity android:name="com.example.MainActivity"></activity> 
</application> 

Und das ist meine Anwendungsklasse:

public class MyApplication extends Application { 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Parse.initialize(new Parse.Configuration.Builder(this) 
      .applicationId(Const.APP_ID) 
      .server(Const.SERVER_URL) 
      .build()); 
} 

@Override 
protected void attachBaseContext(Context base) { 
    super.attachBaseContext(base); 
    MultiDex.install(this); 
} 
} 

Ich denke, das Problem ist in Parse.initialize Anweisung in MyApplication-Klasse. Weil, wenn ich meine App debugge und einen Haltepunkt auf dieser Aussage einstelle (alles scheint vor dieser Aussage in Ordnung), wenn die Initialisierungsanweisung ausgeführt wird, stürzt meine APP ab. Ich habe viel gesucht und ich habe keine Lösung für dieses Problem gefunden. Bitte helfen ...

EDIT: Ok nach weiterer Forschung und dem Spiel mit gradle Abhängigkeiten habe ich herausgefunden, dass dieser Fehler nicht wegen multiDexEnabled ist es eher wegen des Konflikts zwischen okhttp Bibliothek von Parse verwendet wird, und Google- Karten-Dienste. Google-maps-services verwenden OkHttp: 2.0.0, wobei ich als Parse vermutlich OkHttp: 2.4.0 verwende. Ich denke, OKHttp: 2.0.0 hat keine solche Methode des Namens setFollowRedirects und es überschreibt OkHttp: 2.4.0 das ist, warum meine App abstürzt. Wenn ich die Kompilierungsanweisung google-maps-services lösche, funktioniert meine App gut.

Hinweis: Wenn ich tun compile com.squareup.okhttp:okhttp:2.4.0 der Fehler nicht mehr kommt, aber meine Parse-Funktionen (d. H. Anmeldung und Anmeldung Rückruf) geben diesen Fehler com.parse.ParseException:java.lang.IllegalArgumentException: value == null, sie funktionieren nicht mehr.

+0

Haben Sie versucht, 'MultiDex.install (this);' before 'super.onCreate();'? – diogojme

+0

spielt das eine Rolle? Weil ich es bereits in der 'attachBaseContext' Methode hinzugefügt habe, und ich habe mit der Log-Anweisung überprüft, dass es vor' onCreate() 'aufgerufen wird. –

+0

Ich habe versucht, immer noch der gleiche Fehler. –

Antwort

1

Wenn Sie Parse initialisieren, übergeben Sie eine leere Zeichenfolge an den Clientschlüssel.

Parse.initialize(new Parse.Configuration.Builder(this) 
     .applicationId(Const.APP_ID) 
     .server(Const.SERVER_URL) 
     .clientKey("") 
     .build()); 
+0

: D es hat funktioniert, vielen Dank !!! Ich dachte nicht einmal, dass dies die richtige Antwort sein könnte. Aber ich weiß nicht, warum das Initialisieren von Clientkey mit leerer Zeichenfolge das Problem löst? –

0

Versuchen Zugabe

compile 'com.squareup.okhttp:okhttp:2.4.0' 

auf Ihre build.gradle Datei.

+0

Das löst den 'NoSuchMethodError', aber leider parse sdk funktioniert nicht mehr, wenn ich das tue. Es gibt 'com.parse.ParseException: java.lang.IllegalArgumentException: value == null 'für jede Methode, die ich von parse sdk aufruft. Zum Beispiel auf 'ParseUser.logInInBackground' oder' ParseUser.signUpInBackground' –

+0

Bitte lesen Sie die Bearbeitung, und sehen Sie, ob Sie helfen können? –