NoMethodError на стандартном объекте времени выполнения Android - PullRequest
5 голосов
/ 25 августа 2010

Привет, я получаю очень странную ошибку, которую просто не могу разобрать при попытке сериализации объектов в JSON на всех платформах Android, от 1,5 до 2,2 (как на телефонах, так и на эмуляторах).

Я получаюэта ошибка:

E/AndroidRuntime(21017): Uncaught handler: thread AsyncTask #2 exiting due to uncaught exception
E/AndroidRuntime(21017): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(21017):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
E/AndroidRuntime(21017):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
E/AndroidRuntime(21017):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
E/AndroidRuntime(21017):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
E/AndroidRuntime(21017):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
E/AndroidRuntime(21017):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
E/AndroidRuntime(21017):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
E/AndroidRuntime(21017):    at java.lang.Thread.run(Thread.java:1096)
E/AndroidRuntime(21017): Caused by: java.lang.NoSuchMethodError: org.json.JSONStringer.object
E/AndroidRuntime(21017):    at com.qype.radar.api.json.JsonSerializationHelper.startModel(JsonSerializationHelper.java:119)
E/AndroidRuntime(21017):    at com.qype.radar.api.json.JsonSerializationHelper.serializeCheckin(JsonSerializationHelper.java:94)
E/AndroidRuntime(21017):    at com.qype.radar.api.QypeApiImpl.submitCheckin(QypeApiImpl.java:157)
E/AndroidRuntime(21017):    at com.qype.radar.activities.tasks.SubmitCheckinTask.doCheckedInBackground(SubmitCheckinTask.java:29)
E/AndroidRuntime(21017):    at com.qype.radar.activities.tasks.SubmitCheckinTask.doCheckedInBackground(SubmitCheckinTask.java:1)
E/AndroidRuntime(21017):    at com.github.droidfu.concurrent.BetterAsyncTask.doInBackground(BetterAsyncTask.java:154)
E/AndroidRuntime(21017):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
E/AndroidRuntime(21017):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
E/AndroidRuntime(21017):    ... 4 more

при поступлении на строку 'stringer.object' из 'startModel ()' при сериализации обзора в этом коде:

package com.qype.radar.api.json;

import org.json.JSONException;
import org.json.JSONStringer;

import com.qype.radar.model.Review;

public class JsonSerializationHelper {

    private JSONStringer stringer = new JSONStringer();

    ...

    public String serializeReview(Review review) throws JSONException {

        startModel("review");

        value("rating", review.getRating());
        value("language", review.getLanguage());
        value("content", review.getText());

        return endModel();
    }

    ...

    private JSONStringer startModel(String name) throws JSONException {
        stringer.object();
        stringer.key(name);
        stringer.object();
        return stringer;
    }

    private String endModel() throws JSONException {
        stringer.endObject();
        stringer.endObject();
        return stringer.toString();
    }

    private void value(String key, String value) throws JSONException {
        stringer.key(key);
        stringer.value(value);
    }

    private void value(String key, int value) throws JSONException {
        stringer.key(key);
        stringer.value(value);
    }
}

Самое странное в этомв том, что код компилируется нормально, и при отладке экземпляр объекта JSONStringer создается нормально, но любые вызовы к нему выдают эту ошибку.Я также могу, используя рефлексию Java, обнаружить, что класс существует, и все методы, которые я могу извлечь из объекта класса, есть и могут быть вызваны без ошибок.

Пакет org.jsonстандарт в Android, доступен с версии API 1.

Любая помощь в решении этой проблемы будет принята, поскольку я просто не знаю, где искать.

1 Ответ

4 голосов
/ 26 августа 2010

Оказывается, это была проблема с Android JAR от Maven Central.Он зависит от JAR-файлов JSON, но они не работают в Maven Central (класс JSONStringer пуст, определяет только метод toString ()).

Если вы также используете Maven, вы можете это исправитьпутем развертывания jar-файла SDK с помощью maven-android-sdk-deployer и перехода оттуда.

См. эту тему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...