java.lang.ClassNotFoundException in AsyncTask on API 16 to 19
<p>I have an error that only happens in android 4 (API 16 to 19). </p>

<p>I use the following code </p>

<pre><code>private class AcceptBooking extends AsyncTask&lt;String, Void, String&gt; {
    int response;

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onPostExecute(String s) {
        switch (response){
            case NO_UPDATE:
                startApp();
                break;
            case SUGEST_UPDATE:
                adviceUpdate();
                break;
            case FORCE_UPDATE:
                forceUpdate();
                break;
            default:
                startApp();
                break;
        }

    }

    @Override
    protected String doInBackground(String... params) {
        response = DBConnect.updateApp();

        return "done";
    }
}
</code></pre>

<p>And when I try to execute this AsyncTask I get the following error:</p>

<pre><code>com.socialcar E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:299)
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.NoClassDefFoundError: com/socialcar/api_connection/DBConnect
    at com.socialcar.SplashScreenActivity$AcceptBooking.doInBackground(SplashScreenActivity.java:154)
    at com.socialcar.SplashScreenActivity$AcceptBooking.doInBackground(SplashScreenActivity.java:126)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    at java.lang.Thread.run(Thread.java:856) 
 Caused by: java.lang.ClassNotFoundException: com.socialcar.api_connection.DBConnect
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at com.socialcar.SplashScreenActivity$AcceptBooking.doInBackground(SplashScreenActivity.java:154) 
    at com.socialcar.SplashScreenActivity$AcceptBooking.doInBackground(SplashScreenActivity.java:126) 
    at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    at java.lang.Thread.run(Thread.java:856) 
</code></pre>

<p>And this is the dependencies that I have in gradle:</p>

<pre><code>compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.android.support:design:23.2.0'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
    compile 'com.google.android.gms:play-services:7.8.0'
    compile 'org.apache.httpcomponents:httpmime:4.2.3'
    compile 'com.google.guava:guava-jdk5:17.0'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
    compile 'de.hdodenhof:circleimageview:2.0.0'
    compile 'com.android.support:cardview-v7:23.0.+'
    compile 'com.android.support:recyclerview-v7:23.0.+'
</code></pre>

<p>I try to find a solution in this and other forums and apparently the com.android.support:appcompat-v7 version can be the problem but changing that won´t work. And Also I java.util.objects is introduced in Java 7 and that this also can affect but I not sure what to do to fix this. </p>

<p>Any other idea will be welcome. </p>

<p><strong>EDIT</strong></p>

<p>Here is the BDConnect class that is giving the error:</p>

<pre><code>import android.content.pm.PackageInfo;
import android.os.Build;

import com.socialcar.BuildConfig;
import com.socialcar.Config;
import com.socialcar.booking.NavigationActivity;
import com.socialcar.custom.SHA1;
import com.socialcar.http.RequestMethod;
import com.socialcar.http.RestClient;
import com.socialcar.model.Booking;
import com.socialcar.model.BookingList;
import com.socialcar.model.LoginResult;
import com.socialcar.model.Token;

import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by PcCom1 on 14/03/2016.
 */
public class DBConnect {
    private static String URL = "https://someurl.com/";
    private static String SOCIAL_CAR_URL_OAUTH = URL + "test/auth";
    private static String SOCIAL_CAR_URL = URL + "test";
    private static String SOCIAL_CAR_URL_NO_V1 = URL + "test";
    private static String SOCIAL_CAR_URL_LOGIN = URL + "test/login";


    private static void checkResponseCode(RestClient restClient) throws IOException, IllegalStateException {
        int responseCode = restClient.getResponseCode();
        if (responseCode == 500 || responseCode == 503) {
            // ERRO no servidor
        } else if (responseCode == 404) {
            // ERRO pagina nao encontrada
        } else if (responseCode == 401) {
            if (restClient.getResponse().contains("Invalid JWT")){
                throw new IOException("JWT");
            }
        } else if (responseCode != 200) {
            // ERRO se a resposta n?o for a correta
            throw new IOException();
        }

    }

    public static int updateApp(){
        String response = "";
        try {
            RestClient restClient = new RestClient(SOCIAL_CAR_URL+"/mobile/updates");
            String model = Build.MODEL;
            int version = Build.VERSION.SDK_INT;
            int versionCode = BuildConfig.VERSION_CODE;
            JSONObject data = new JSONObject();
            data.put("mobile", model);
            data.put("sdk-version", version);
            data.put("version-code", versionCode);
            restClient.setJsonObject(data);
            restClient.execute(RequestMethod.POST);
            checkResponseCode(restClient);
            response = restClient.getResponse();
            JSONObject jsonObject = new JSONObject(response);
            return jsonObject.getInt("update");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return 0;
        }
    }

    public static Token refreshToken(String refreshToken){
        String response = "";
        Token token = new Token();
        try {
            //password = SHA1.toSHA1(password);
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_NO_V1+"/token-refresh");
            JSONObject data = new JSONObject();
            data.put("_token", refreshToken);
            restClient.setJsonObject(data);
            restClient.execute(RequestMethod.POST);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            // Error de conexión
            return null;
        }
        try {
            JSONObject jsonObject = new JSONObject(response);
            token.setToken(jsonObject.getString("token"));
            token.setRefreshToken(jsonObject.getString("refresh_token"));
            return token;
        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            return null;
        }
    }

    public static int logout(String email, String registration_id, String token){
        String response = "";
        try {
            //password = SHA1.toSHA1(password);
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_OAUTH+"/user/logouts", token, null);
            JSONObject data = new JSONObject();
            data.put("_username", email);
            data.put("device_token", registration_id);
            restClient.setJsonObject(data);
            restClient.execute(RequestMethod.POST_TOKEN);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            // Error de conexión
            return -999;
        }
        try {
            JSONObject jsonObject = new JSONObject(response);
            return jsonObject.getInt("error");

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            return -1000;
        }
    }

    public static Token login(String email, String password){
        String response = "";
        Token token = new Token();
        try {
            //password = SHA1.toSHA1(password);
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_NO_V1+"/login-check");
            JSONObject data = new JSONObject();
            data.put("_username", email);
            data.put("_password", password);
            restClient.setJsonObject(data);
            restClient.execute(RequestMethod.POST);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            // Error de conexión
            return null;
        }
        try {
            JSONObject jsonObject = new JSONObject(response);
            token.setToken(jsonObject.getString("token"));
            if(jsonObject.has("refresh_token"))
                token.setRefreshToken(jsonObject.getString("refresh_token"));
            return token;

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            return null;
        }
    }

    public static LoginResult getUserInfo(String regId, Token token){
        String response = "";
        LoginResult loginResult;
        try {

            RestClient restClient = new RestClient(
                    SOCIAL_CAR_URL_OAUTH+"/user/info?device_token=" + regId,
                    token.getToken(), null);
            restClient.execute(RequestMethod.GET_TOKEN);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            loginResult = new LoginResult();
            // Error de conexión
            loginResult.setError(999);
            return loginResult;
        }
        try {

            loginResult  = JSONParser.getLoginResultFromJson(response);


            return loginResult;

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            loginResult = new LoginResult();
            loginResult.setError(1000);
            return loginResult;
        }
    }

    public static Token loginFacebook(String facebookId, String facebookToken, String email, String regId){
        String response = "";
        Token token = new Token();
        try {
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_LOGIN+"/facebooks", null, facebookId);
            JSONObject data = new JSONObject();
            data.put("email", email);
            data.put("facebook_id", facebookId);
            data.put("token-facebook", facebookToken);
            restClient.setJsonObject(data);
            restClient.execute(RequestMethod.POST_OAUTH);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
        try {
            JSONObject jsonObject = new JSONObject(response);
            if (jsonObject.has("token")){
                token.setToken(jsonObject.getString("token"));
                token.setRefreshToken(jsonObject.getString("refresh_token"));
                token.setError(0);
                return token;
            }
            token.setError(jsonObject.getInt("error"));
            return token;


        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            return null;
        }
    }

    public static Token loginGooglePlus(String googleId, String googleToken, String email, String regId){
        String response = "";
        Token token = new Token();
        try {
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_LOGIN+"/googles", null, googleId);
            JSONObject data = new JSONObject();
            data.put("email", email);
            data.put("google_id", googleId);
            data.put("token_google", googleToken);
            restClient.setJsonObject(data);
            restClient.execute(RequestMethod.POST_OAUTH);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
        try {

            JSONObject jsonObject = new JSONObject(response);
            if (jsonObject.has("token")){
                token.setToken(jsonObject.getString("token"));
                token.setRefreshToken(jsonObject.getString("refresh_token"));
                token.setError(0);
                return token;
            }
            token.setError(jsonObject.getInt("error"));
            return token;

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            return null;
        }
    }

    public static BookingList getPendingBookingList(int ownerId, String token){
        String response = "";
        BookingList bookingList;
        try {
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_OAUTH+"/booking/pendings/"+ownerId, token, null);
            restClient.execute(RequestMethod.GET_TOKEN);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(e.getMessage() == "JWT"){
                bookingList = new BookingList();
                // Error de conexión
                bookingList.setError(Config.JWT_EXPIRED);
                bookingList.setBookings(new ArrayList&lt;Booking&gt;());
                return bookingList;
            }
            bookingList = new BookingList();
            // Error de conexión
            bookingList.setError(999);
            bookingList.setBookings(new ArrayList&lt;Booking&gt;());
            return bookingList;
        }
        try {

            bookingList  = JSONParser.getBookingListFromJson(response);
            return bookingList;

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            bookingList = new BookingList();
            bookingList.setError(1000);
            bookingList.setBookings(new ArrayList&lt;Booking&gt;());
            return bookingList;
        }
    }

    public static Booking getBookingDetailsOwner(int booking_line, String token){
        String response = "";
        Booking booking;
        try {
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_OAUTH+"/booking/owner_details/"+booking_line, token, null);
            restClient.execute(RequestMethod.GET_TOKEN);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(e.getMessage() == "JWT"){
                booking = new Booking();
                // Error de conexión
                booking.setError(Config.JWT_EXPIRED);
                return booking;
            }
            booking = new Booking();
            // Error de conexión
            booking.setError(999);
            return booking;
        }
        try {

            booking  = JSONParser.getBookingFromJson(response);


            return booking;

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            booking = new Booking();
            //loginResult.setError(1000);
            return booking;
        }
    }

    public static int cancelBookingByOwner(int booking_line, String reason, String description, String token){
        String response = "";
        try {
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_OAUTH+"/booking/cancels/"+booking_line, token, null);
            JSONObject data = new JSONObject();
            data.put("reason", reason);
            data.put("reason_description", description);
            restClient.setJsonObject(data);
            restClient.execute(RequestMethod.POST_TOKEN);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(e.getMessage() == "JWT") {
                return Config.JWT_EXPIRED;
            }
            // Error de conexión
            return 999;
        }
        try {

            int error  = JSONParser.getErrorResultFromJson(response);


            return error;

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            //loginResult.setError(1000);
            return 1000;
        }
    }

    public static int acceptBookingByOwner(int booking_line, String token){
        String response = "";
        try {
            RestClient restClient = new RestClient(SOCIAL_CAR_URL_OAUTH+"/booking/accepts/"+booking_line, token, null);
            restClient.execute(RequestMethod.GET_TOKEN);
            checkResponseCode(restClient);
            response = restClient.getResponse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            // Error de conexión
            return 999;
        }
        try {
            int error  = JSONParser.getErrorResultFromJson(response);
            return error;

        } catch (Exception e) {
            //error desconocido de parseo
            e.printStackTrace();
            if(e.getMessage() == "JWT") {
                return Config.JWT_EXPIRED;
            }
            //loginResult.setError(1000);
            return 1000;
        }
    }

}
</code></pre>

<p>and the gradle:</p>

<pre><code>android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    useLibrary 'org.apache.http.legacy'
    defaultConfig {
        applicationId "com.socialcar"
        minSdkVersion 16
        targetSdkVersion 23
        multiDexEnabled true
        versionCode 33
        versionName "3.0.1"
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }
    packagingOptions {
        exclude 'META-INF/NOTICE.txt' // will not include NOTICE file
        exclude 'META-INF/LICENSE.txt' // will not include LICENSE file
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:17.2.0'
    compile 'com.android.support:design:23.2.0'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
    compile 'com.google.android.gms:play-services:7.8.0'
    compile 'org.apache.httpcomponents:httpmime:4.2.3'
    compile 'com.google.guava:guava-jdk5:17.0'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
    compile 'de.hdodenhof:circleimageview:2.0.0'
    compile 'com.android.support:cardview-v7:23.0.+'
    compile 'com.android.support:recyclerview-v7:23.0.+'
}
</code></pre>

<p>Manifest:</p>

<pre><code>&lt;application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"&gt;

        &lt;meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version"/&gt;

        &lt;meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/&gt;

        &lt;activity
            android:name=".SplashScreenActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"&gt;
            &lt;intent-filter&gt;
                &lt;action android:name="android.intent.action.MAIN" /&gt;

                &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
        &lt;activity
            android:name=".login.LoginActivity"
            android:label="@string/app_name"
            android:configChanges="orientation"
            android:screenOrientation="portrait"&gt;
        &lt;/activity&gt;
        &lt;activity
            android:name=".booking.NavigationActivity"
            android:label="@string/action_booking"
            android:theme="@style/AppTheme.NoActionBar"
            android:configChanges="orientation"
            android:screenOrientation="portrait"&gt;
        &lt;/activity&gt;

        &lt;activity android:name="com.facebook.FacebookActivity"
            android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:label="@string/app_name"
            android:screenOrientation="portrait"/&gt;

        &lt;receiver
            android:name="com.socialcar.gcm.GcmReceiver"
            android:permission="com.google.android.c2dm.permission.SEND"&gt;
            &lt;intent-filter&gt;
                &lt;action android:name="com.google.android.c2dm.intent.RECEIVE"/&gt;
                &lt;action android:name="com.google.android.c2dm.intent.REGISTRATION" /&gt;
                &lt;category android:name="com.socialcar"/&gt;
            &lt;/intent-filter&gt;
        &lt;/receiver&gt;
        &lt;service
            android:name="com.socialcar.gcm.GcmMessageHandler"
            android:exported="false"&gt;
            &lt;intent-filter&gt;
                &lt;action android:name="com.google.android.c2dm.intent.RECEIVE" /&gt;
            &lt;/intent-filter&gt;
        &lt;/service&gt;
    &lt;/application&gt;
</code></pre>