首先是依赖项
{
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)
我也遇到过同样的问题。您可以使用此替代方法。添加一个名为“ 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();
}
}
对我有用。