我正在使用Gson将数据映射到ArrayList。它在设备上运行app或处于调试模式时工作正常,但它不是在生产模式APK中映射数据。 这是代码
Const.courses = new ArrayList<>();
Log.v("Courses",object.toString());
Type type = new TypeToken<ArrayList<Course>>() {
}.getType();
if(object != null && object.has("data") ){
try {
if(object.get("data") != null && object.getJSONArray("data").length()>0) {
Const.courses.clear();
Const.courses = new GsonBuilder().create().fromJson(object.getJSONArray("data").toString(), type);
Log.d("Course from Array",Const.courses.get(0).getTitle());
adapter = new CourseAdapter(getApplicationContext(), R.layout.course_row_layout, Const.courses);
listView.setDivider(new ColorDrawable(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent)));
listView.setAdapter(adapter);
}else{
tvSelectCourse.setVisibility(View.GONE);
tvNoCourse.setVisibility(View.VISIBLE);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
这是Logcat。任何帮助都会得到赞赏。
02-16 23:30:57.836 1234-1234/? V/Courses: {"contentEncoding":null,"contentType":null,"data":[{"id":1,"title":"course Updated"},{"id":12,"title":"Arabic"},{"id":13,"title":"usman"},{"id":14,"title":"really "},{"id":15,"title":"urdu"},{"id":17,"title":"abc"},{"id":21,"title":"course"},{"id":22,"title":"Ali don"},{"id":24,"title":"umair"},{"id":25,"title":"math"},{"id":27,"title":"world"},{"id":28,"title":"wether"},{"id":33,"title":"computer Science "},{"id":34,"title":"cs"},{"id":37,"title":"maths"},{"id":38,"title":"hello"},{"id":39,"title":"course Updated"},{"id":42,"title":"for testing purpose"}],"jsonRequestBehavior":0,"maxJsonLength":null,"recursionLimit":null}
02-16 23:30:57.852 1234-1234/? D/AndroidRuntime: Shutting down VM
02-16 23:30:57.859 1234-1234/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.umer.doratiteacher, PID: 1234
java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.d(Log.java:139)
at com.umer.doratiteacher.MainActivity$3.a(Unknown Source)
at com.umer.doratiteacher.d.a$3.a(Unknown Source)
at com.umer.doratiteacher.d.a$3.a(Unknown Source)
at com.a.a.a.i.a(Unknown Source)
at com.a.a.e$a.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:234)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
答案 0 :(得分:2)
@Gary已正确识别出Proguard是这里的问题。他给出的解决方案确实有效。实现此目的的另一种方法是添加
@Keep
从androidx.annotation.Keep
到yourClass的注释。
答案 1 :(得分:1)
如前所述,问题来自Proguard(minifyEnabledtrue
时)。 Proguard摆脱了GSON解析所需的Type
。
根据此链接https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg,我只需添加3行即可让我的代码正常工作
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.example.YourPackage.** { *; }
最后一行是您的代码所在的包的名称。如果您将所有代码放在一个主包中(所有java文件都在一个目录中)或只在一个文件中进行GSON解析,那么请替换为last为此(我已经测试了以上但未测试以下内容)
-keep class com.example.YourPackage.YourClass.** { *; }
答案 2 :(得分:0)
乍一看堆栈跟踪,看起来你正在将null
传递给你的日志通话:
Log.d("Course from Array",Const.courses.get(0).getTitle());
。
快速解决方法是在将getTitle()
方法传递给log方法之前检查以确保null
方法不是Log.d("Course from Array", TextUtils.isEmpty(Const.courses.get(0).getTitle()) ? "" : Const.courses.get(0).getTitle());
。所以,像input
答案 3 :(得分:0)
这是build.gradle中的代码
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
lintOptions {
disable 'MissingTranslation'
}
}
...
您必须在proguard_rules.pro
中定义哪些类不应更改其名称这是我的:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-dontwarn org.joda.time.**
-keep class org.joda.time.** {
*;
}
-keep class com.xxx.xxx.** {
public *;
}
-keep class android.support.**{*;}
-keep class org.jsoup.**{*;}
-keep class com.google.**{*;}
使用-keep保存您的班级名称或方法名称, 这是文件
的详细链接# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
答案 4 :(得分:0)
您应该注释您的类属性,以便Gson知道要查找的内容:
public class RData {
@SerializedName("code")
public String code;
@SerializedName("info")
public String info;
}