10

JSON文字列を使用してサーバーから関心のあるポイントをダウンロードするAndroid用のアプリを開発しています。すべてが正常に機能していましたが、4.2.1でテストを開始してから、次のエラーが発生しました。

01-28 15:32:14.167: E/AndroidRuntime(31174): FATAL EXCEPTION: AsyncTask #1
01-28 15:32:14.167: E/AndroidRuntime(31174): java.lang.RuntimeException: An error occured while executing doInBackground()
01-28 15:32:14.167: E/AndroidRuntime(31174):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at java.lang.Thread.run(Thread.java:856)
01-28 15:32:14.167: E/AndroidRuntime(31174): Caused by: java.lang.StackOverflowError
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:371)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:355)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.Gson.getAdapter(Gson.java:353)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.Gson.getAdapter(Gson.java:353)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.Gson.getAdapter(Gson.java:353)
01-28 15:32:14.167: E/AndroidRuntime(31174):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:

奇妙なことに、私が試した他のすべてのバージョンで正常に動作します...

これが私がクラッシュしていると思う行です:

    Gson g = new Gson();
    JSONResponse jsonResponse = g.fromJson(serverReply, JSONResponse.class); <---

そして私が作成しようとしているクラス:

/**
 * The JSONResponse from the server
 * @author Tom
 *
 */
public class JSONResponse {
    private String          status;
    private PointOfInterest result;

    /**
     * Creates a JSONResponse object 
     * @param json
     * @return
     */
    static JSONResponse convertJSONToResponse(String json){
        Gson gson = new Gson();
        JSONResponse jsonResponse = gson.fromJson(json, JSONResponse.class);
        return jsonResponse;
    }

    /**
     * Get Point of Interest
     */

    public PointOfInterest getPointofInterest(){
        return result;
    }

    public String getStatus(){
        return status;
    }

    /**
     * Get PrivateSection, area we can put our own data
     */
    /*
    public String getPrivateSection(){
        return privateSection;
    }
    */
    /**
     * Creates a JSONResponse object 
     * @param json
     * @return
     */
    String convertJSONResponseToJSON(){
        Gson gson = new Gson();
        return gson.toJson(this);
    }
}

私がここで採用したひどいデザインパターンを知っていることに注意してください。このアプリケーションは、私が大学で受講しているモバイルアプリクラス用です。

編集 gsonを1.7.1にダウングレードするとうまくいきます。

4

2 に答える 2

14

したがって、Erik Nedwidekが指摘したように、これはバグであることがわかります。私は簡単なルートを取り、gsonを2.2.2から1.7.1にダウングレードしました。これで、すべてがうまく機能します。

于 2013-01-28T17:15:40.823 に答える
3

このバグレポートを確認してください。http://code.google.com/p/google-gson/issues/detail?id=440

コメント#12:

WeakReferenceとSoftReferenceの内部が自己参照に変更されたのはAPI17であったと思います。これにより、これがトリガーされます。Gsonを使用してWeakReferenceまたはSoftReferenceをシリアル化していますか?もしそうなら、あなたはそれらのタイプのためにあなた自身のTypeAdapterを書くべきです。

コード内の何かが循環参照を引き起こしており、4.2.1(API 17)まで機能するため、Javaクラスの1つである可能性があります。それでもあなたのコードかもしれませんが、私は非常に疑わしいです。

于 2013-01-28T15:57:16.390 に答える