Skip to content Skip to sidebar Skip to footer

Java.lang.noclassdeffounderror Retrofit2.utils

I'm using Retrofit to handle the Serverside Data from Mobile. After Implementing retrofit, I am Getting the below Exception. What am I doing wrong? com.name.App_idea W/System.err:

Solution 1:

This error will come because of MultiDexApplication .I have face this kind of issue with some other library not same library but some other library.It will error of the retrofit library because its initialization of app start up where dex(in which your retrofit library code is converted to dex) file is not to set(install).

To resolve that you need to handle Multiple Dex file. with the help of application build.gradle & Application class

below changes which is required in build.gradle file

dexOptions {
        incremental true// here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }


dependencies {
     compile 'com.android.support:multidex:1.0.1'//    your dependencies which you are using.

}

entire build.gradle

android {
    signingConfigs {
        /*
        releasebuild {
            keyAlias 'hellotest'
            keyPassword 'hellotest'
            storeFile file('path to keystore')
            storePassword 'hellotest'
        }
        */
    }
    compileSdkVersion 'Google Inc.:Google APIs:22'
    buildToolsVersion '23.0.0'/* if you got error regarding duplicate file of  META-INF/LICENSE.txt from jar file
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
    */
    dexOptions {
        jumboMode = true
        incremental true// here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }
    defaultConfig {
        multiDexEnabled true
        applicationId "com.myapp.packagenme"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releasebuild
        }
        debug {
            signingConfig signingConfigs.releasebuild
        }
    }
}

dependencies {
     compile 'com.android.support:multidex:1.0.1'//    your dependencies which you are using.

}

If your app uses extends the Applicationclass, you can override the attachBaseContext() method and call MultiDex.install(this) to enable multidex. To install multipledex file context using Applicaiton class which should extends [MultiDexApplication][2]

publicclassMyAppClassextendsMultiDexApplication{
@OverrideprotectedvoidattachBaseContext(Context newBase) {
        MultiDex.install(newBase);
        super.attachBaseContext(newBase);
    }
}

Suggestion

Selectively compiling APIs into your executable

Don't use entire google play service use only required library.From version 6.5, you can instead selectively compile Google Play service APIs into your app. For example, to include only the Google Fit and Android Wear APIs, replace the following line in your build.gradle file:

compile'com.google.android.gms:play-services:8.4.0'

with these lines:

compile'com.google.android.gms:play-services-fitness:8.4.0'compile'com.google.android.gms:play-services-wearable:8.4.0'

With the reference of my answer https://stackoverflow.com/a/34948154/1140237

Solution 2:

I was facing this error below lollipop devices.

I was using multiDexEnabled true.

After adding this code to the class extending Application class my issue solved.

@OverrideprotectedvoidattachBaseContext(Context context) {
    super.attachBaseContext(context);
    MultiDex.install(this);
}

reference: https://stackoverflow.com/a/39968486/4777524

Solution 3:

It's Gradle bulid configure issue i also got same issue Some times

In Gradle your using

compile'com.google.android.gms:play-services:8.4.0'

Enire Google Playservice Lib can you change into which are the lib's using in your project

Example

com.google.android.gms:play-services-gcm:8.4.0 com.google.android.gms:play-services-maps:8.4.0com.google.android.gms:play-services-auth:8.4.0

Refer This URl https://developers.google.com/android/guides/setup#add_google_play_services_to_your_project

Solution 4:

Did you add the following proguard rules?

-dontwarn retrofit2.**-keep class retrofit2.** { *; }-keepattributes Signature-keepattributes Exceptions

Documentation: http://square.github.io/retrofit/

Solution 5:

You should make Utils class like this:

publicclassAppUtil{
publicstaticRetrofitgetRetrofitInstance(){
        HttpLoggingInterceptor logging=newHttpLoggingInterceptor();
        if(isEnableLogging)
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        else
            logging.setLevel(HttpLoggingInterceptor.Level.NONE);
        Gson gson = newGsonBuilder()
                .setExclusionStrategies(newExclusionStrategy() {
                    @OverridepublicbooleanshouldSkipField(FieldAttributes f) {
                        return f.getDeclaringClass().equals(RealmObject.class);
                    }

                    @OverridepublicbooleanshouldSkipClass(Class<?> clazz) {
                        returnfalse;
                    }
                })
                .create();
        OkHttpClient.Builder httpClient = newOkHttpClient.Builder();
        httpClient.addInterceptor(logging);

        returnnewRetrofit.Builder()
                .baseUrl(Constants.URL_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient.build())
                .build();

    }



}

Create an interface like this for the http methods:

publicinterfaceEndPointInterface{
 @FormUrlEncoded@POST(Constants.URL_LOGON)
    Call<Doctor> login(@Field(Constants.EMAIL) String email,
                       @Field(Constants.PASSWORD) String password);
} 

In your activity where you are calling the webservices,please proceed like this:

@OnClick(R.id.btn_login)publicvoidonLoginButtonClick() {
        StringemailString= edtEmail.getText().toString().trim();
        StringpasswordString= edtPassword.getText().toString().trim();

        if (emailString.length() == 0) {
            emailWrapper.setError("Please enter E-Mail ID");
        } elseif (!AppUtil.isEmailValid(emailString)) {
            emailWrapper.setError("Please enter valid E-Mail ID");
        } elseif (passwordString.length() == 0) {
            passwordWrapper.setError("Please enter password");
        } elseif (AppUtil.isNetworkConnectionAvailable(this, true)) {
            login(emailString,passwordString);
        }
    }

 privatevoidlogin(String email, String pwd) {
        finalMaterialDialogdialog= AppUtil.showIndeterminateProgressDialog(this,getString(R.string.please_wait));
        EndPointInterfaceapiService= AppUtil.getRetrofitInstance().create(EndPointInterface.class);
        Call<Doctor> call = apiService.login(email, pwd);
        call.enqueue(newCallback<Doctor>() {
            @OverridepublicvoidonResponse(Call<Doctor> call, Response<Doctor> response) {
                dialog.dismiss();
                if (response.code() == 200) {
                    Doctordoctor= response.body();
                    if (doctor == null) {
                        AppUtil.showSimpleDialog(LoginActivity.this, getString(R.string.userid_pwd_mismatched),
                                getString(R.string.login_credential_mismatch));
                    } else {
                        SharedPreferences.Editoreditor= mAppPreferences.edit();
                        editor.putString(Constants.SETTINGS_OBJ_DOCTOR, newGson().toJson(doctor));
                        editor.putBoolean(Constants.SETTINGS_IS_LOGGED_IN, true);
                        editor.commit();

                        startActivity(newIntent(LoginActivity.this, PatientSummaryInfoActivity.class));
                        finish();
                    }
                } else {
                    dialog.dismiss();
                    AppUtil.showSimpleDialog(LoginActivity.this, getString(R.string.server_error),
                            getString(R.string.could_not_connect_to_server));
                }

            }

            @OverridepublicvoidonFailure(Call<Doctor> call, Throwable t) {
                dialog.dismiss();
                AppUtil.showSimpleDialog(LoginActivity.this,getString(R.string.server_error), t.getMessage());
            }

        });
    }

Post a Comment for "Java.lang.noclassdeffounderror Retrofit2.utils"