3

5000台のデバイスのうち10台でのみ発生する問題があります。私のエミュレーターとテストデバイスでそれを再現する可能性はありません。これは、ごく少数のデバイスでは非常に特殊な問題のようです。私が持っているのは、スタックトレースと私のコードだけです。だから私はブラックホールに対して開発していて、GooglePlayで新しいバージョンをリリースした後で初めて、変更によって問題が解決したかどうかを確認します。新しいバージョンをGooglePlayに更新しましたが、エラーがまだ存在します。

変更はパラメーターなしのコンストラクターであり、WorkIemクラスをstaticに変更します。

スタックトレースは次のとおりです。

W 6758/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x401a15a0)
E 6758/AndroidRuntime: FATAL EXCEPTION: main
**Caused by: java.lang.RuntimeException: No-args constructor for class com.mypackage.model.UpdaterObject$UpdateReport does not exist. Register an InstanceCreator with Gson for this type to fix this problem.**
    at com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:64)
    at com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:53)
    at com.google.gson.JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:40)
    at com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56)
    at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:109)
    at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73)
    at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51)
    at com.google.gson.Gson.fromJson(Gson.java:568)
    at com.google.gson.Gson.fromJson(Gson.java:515)
    at com.google.gson.Gson.fromJson(Gson.java:484)
    at com.google.gson.Gson.fromJson(Gson.java:434)
    at com.google.gson.Gson.fromJson(Gson.java:406)
    **at de.fliese.NewVersionCheckerActivity.onCreate(NewVersionCheckerActivity.java:35)**

これは35行目です。

UpdateReport report = new Gson().fromJson(jsonStr, UpdateReport.class);

json-Stringは次のようになります(Workitemsはnullになる可能性があります):

{"WorkItems":
[{"Url":"http://url1.comfoo.zip","TypeId":1,"LastModifiedServer":1352598239000},
{"Url":"http://url2.com/bar.zip","TypeId":4,"LastModifiedServer":1352598265000}],
 "ShowQuestionDialog":false,"IsOffline":false,"DoUpdate":true}

そして最後に、innerClassを使用したUpdateReportクラスを次に示します。

public class UpdaterObject{     
public class UpdateReport {

            public boolean IsOffline;
            public boolean DoUpdate;
            public boolean ShowQuestionDialog;
            public List<WorkItem> WorkItems;

            public UpdateReport() {        }

            public UpdateReport(boolean isoffline, boolean doUpdate,
                    List<WorkItem> workitems) {
                IsOffline = isoffline;
                DoUpdate = doUpdate;
                WorkItems = workitems;
            }
        }

        public static class WorkItem {

            public int TypeId;
            public String Url;
            public long LastModifiedServer;

            public WorkItem() {        }

            public WorkItem(int typeId, String url, long lastModifiedServer) {
                TypeId = typeId;
                Url = url;
                LastModifiedServer = lastModifiedServer;
            }
        }
    //some methods [....]
    } //end class UpdaterObject

誰かが私を助けてくれたら嬉しいです。私はそれをテストすることができないので、あなたの答えが絶対に正しいことを確認してください!それは素晴らしいことです!

これはStackOverFlowへの私の最初の投稿です。公平を期してください。:)

ありがとうqd0r

4

2 に答える 2

7

Gson issue 255から、HTC Desire HD のアプリケーション クラスパスに古い Gson のコピーが含まれていました。その号には、jarjar を使用して Gson のバージョンを再パッケージ化し、プリインストールされたバージョンと競合しないようにする手順が記載されています。

于 2012-11-14T03:01:52.380 に答える