Retrofit 2不适用于android api级别17

问题描述 投票:1回答:1

首先是依赖项

  {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.12'``
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.android.material:material:1.0.0'
    //// image slider ///////////
    implementation 'com.github.smarteist:autoimageslider:1.3.2'
    // implementation 'com.github.smarteist:autoimageslider:1.3.2-appcompat'
    /// glide //
    //implementation 'com.github.bumptech.glide:glide:4.10.0'
    //annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
    ////////
    // implementation 'com.squareup.picasso:picasso:2.71828'
    //// retrofit ///////
    implementation "com.squareup.retrofit2:retrofit:2.7.0"
    implementation "com.squareup.retrofit2:converter-gson:2.7.0"
//    implementation files('libs/retrofit-2.7.0.jar')
//    implementation files('libs/converter-gson-2.7.1.jar')

///////////////////////////////////////////////////////////
    implementation 'com.android.support:multidex:1.0.3'

    //OkHttp
    //  implementation 'com.squareup.okhttp3:okhttp:3.13.0'
    //   implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    implementation "com.squareup.okhttp3:logging-interceptor:3.12.3"
    implementation 'com.squareup.okhttp3:okhttp:3.12.3'

这是改造的要求。在棒棒糖以上,它可以正常工作,但在API级别17中却无法工作。

 textView= findViewById(R.id.textView);

    Retrofit retrofit;
    /* ConnectionSpec.MODERN_TLS is the default value */

   // List tlsSpecs = Arrays.asList(ConnectionSpec.MODERN_TLS);

    /* providing backwards-compatibility for API lower than Lollipop: */
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        List tlsSpecs = Arrays.asList(ConnectionSpec.MODERN_TLS);

        tlsSpecs = Arrays.asList(ConnectionSpec.COMPATIBLE_TLS);
        OkHttpClient client = new OkHttpClient.Builder()
                .connectionSpecs(tlsSpecs)
                .build();
         retrofit = new Retrofit.Builder()
                .baseUrl("https://jsonplaceholder.typicode.com/")
                .addConverterFactory(GsonConverterFactory.create())
               // .client(client)
                .build();
    }else {


         retrofit = new Retrofit.Builder()
                .baseUrl("https://jsonplaceholder.typicode.com/")
                .addConverterFactory(GsonConverterFactory.create())

                .build();
    }

// retrofit =新的Retrofit.Builder()// .baseUrl(“ https://jsonplaceholder.typicode.com/”)// .addConverterFactory(GsonConverterFactory.create())//// .build();

    JsonplaceholderApi jsonplaceholderApi = retrofit.create(JsonplaceholderApi.class);
    Call<List<RetrofitPost>> call =  jsonplaceholderApi.getPosts();

    call.enqueue(new Callback<List<RetrofitPost>>() {
        @Override
        public void onResponse(Call<List<RetrofitPost>> call, Response<List<RetrofitPost>> response) {
            if(!response.isSuccessful()){
                textView.setText("Code:"+response.code());
                return;
            }
            List<RetrofitPost> posts = response.body();
            for (RetrofitPost post:posts){
                String content="";
                content+= "ID:"+post.getId()+"\n";
                content+= "User ID:"+post.getUserId()+"\n";
                content+= "Title"+post.getTitle()+"\n";
                content+= "Text"+post.getText()+"\n\n";
                textView.append(content);
            }
        }

        @Override
        public void onFailure(Call<List<RetrofitPost>> call, Throwable t) {

        }
    });
}

它出现此错误:

  java.lang.NoClassDefFoundError: java.util.Objects
        at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:491)
        at com.example.shopingtemplate.activities.RetrofitTest.onCreate(RetrofitTest.java:68)
android retrofit2 okhttp
1个回答
0
投票

我也遇到过同样的问题。您可以使用此替代方法。添加一个名为“ java”的包/文件夹。在该文件夹/文件夹下名为“ util”的文件。在此“ util”文件夹中,创建一个名为Objects的类。

用下面的代码填充Objects.java类。

package java.util;
/**
* Utility methods for objects.
* @since 1.7
*/
public final class Objects {
    private Objects() {}
    /**
    * Returns 0 if {@code a == b}, or {@code c.compare(a, b)} otherwise.
    * That is, this makes {@code c} null-safe.
    */
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
        if (a == b) {
            return 0;
        }
        return c.compare(a, b);
    }
    /**
    * Returns true if both arguments are null,
    * the result of {@link Arrays#equals} if both arguments are primitive arrays,
    * the result of {@link Arrays#deepEquals} if both arguments are arrays of reference types,
    * and the result of {@link #equals} otherwise.
    */

    public static boolean deepEquals(Object a, Object b) {
        if (a == null || b == null) {
            return a == b;
        } else if (a instanceof Object[] && b instanceof Object[]) {
            return Arrays.deepEquals((Object[]) a, (Object[]) b);
        } else if (a instanceof boolean[] && b instanceof boolean[]) {
            return Arrays.equals((boolean[]) a, (boolean[]) b);
        } else if (a instanceof byte[] && b instanceof byte[]) {
            return Arrays.equals((byte[]) a, (byte[]) b);
        } else if (a instanceof char[] && b instanceof char[]) {
            return Arrays.equals((char[]) a, (char[]) b);
        } else if (a instanceof double[] && b instanceof double[]) {
            return Arrays.equals((double[]) a, (double[]) b);
        } else if (a instanceof float[] && b instanceof float[]) {
            return Arrays.equals((float[]) a, (float[]) b);
        } else if (a instanceof int[] && b instanceof int[]) {
            return Arrays.equals((int[]) a, (int[]) b);
        } else if (a instanceof long[] && b instanceof long[]) {
            return Arrays.equals((long[]) a, (long[]) b);
        } else if (a instanceof short[] && b instanceof short[]) {
            return Arrays.equals((short[]) a, (short[]) b);
        }
        return a.equals(b);
    }
    /**
    * Null-safe equivalent of {@code a.equals(b)}.
    */
    public static boolean equals(Object a, Object b) {
        return (a == null) ? (b == null) : a.equals(b);
    }
    /**
    * Convenience wrapper for {@link Arrays#hashCode}, adding varargs.
    * This can be used to compute a hash code for an object's fields as follows:
    * {@code Objects.hash(a, b, c)}.
    */
    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }
    /**
    * Returns 0 for null or {@code o.hashCode()}.
    */
    public static int hashCode(Object o) {
       return (o == null) ? 0 : o.hashCode();
    }
    /**
    * Returns {@code o} if non-null, or throws {@code NullPointerException}.
    */
    public static <T> T requireNonNull(T o) {
        if (o == null) {
            throw new NullPointerException();
        }
        return o;
    }
    /**
    * Returns {@code o} if non-null, or throws {@code NullPointerException}
    * with the given detail message.
    */
    public static <T> T requireNonNull(T o, String message) {
        if (o == null) {
            throw new NullPointerException(message);
        }
        return o;
    }
    /**
    * Returns "null" for null or {@code o.toString()}.
    */
    public static String toString(Object o) {
        return (o == null) ? "null" : o.toString();
    }
    /**
    * Returns {@code nullString} for null or {@code o.toString()}.
    */
    public static String toString(Object o, String nullString) {
        return (o == null) ? nullString : o.toString();
    }
}

对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.