Как отправить большие данные из нативной Java в JavaScript?

Я разрабатываю приложение для Android, у меня есть большая строка JSON около 5 МБ в нативном коде Java. Мне нужно отправить эту строку из кода Java в JavaScript (файлы JS находятся в папке активов). Когда я запускаю приложение, оно зависает.

public String readFileDataofIamge()
{
    StringBuilder text = new StringBuilder();
    String FILE_NAME = "ImageDataFile.txt";
    try {

        BufferedReader reader = new BufferedReader(new InputStreamReader(openFileInput(FILE_NAME)));
        while ((line=reader.readLine())!=null) {
            text.append(line.toString());}
        reader.close();
    }
    catch (Exception e) {
    }

    return text.toString();
}

@JavascriptInterface
public String readImageData()
{
    return readFileDataofIamge();
}

Код JS:

function getDatafromFile() {
    var imageData=Android.readImageData();
}

Если я возвращаю небольшое строковое значение типа hello world, я получаю значение в коде JavaScript.

Так возможно ли отправить эти большие данные из собственного кода в код JavaScript? Если это невозможно, есть ли другой способ отправить большие данные из собственного кода в JS Code?

Условие дано: нет подключения к интернету, поэтому я не могу выполнить HTTP или сетевой вызов.

================================================== ==========================

Обзор приложения:

У меня есть приложение для Android, в котором я использую WebView. все веб-файлы (js и HTML) находятся внутри папки ресурсов. При первом запуске мне нужно получить все данные с сервера. (У меня есть подключение к Интернету в самый первый раз при запуске приложения). Данные очень большие, около 5 МБ, но могут достигать 50 МБ. Мне нужно где-то хранить эти данные. так что если я перезапущу приложение в любое время без подключения к интернету, приложение должно иметь эти данные, и оно должно работать в автономном режиме.

Таким образом, для этого требования я попытался записать эти данные (около 20 МБ) во внутренний файл хранилища и пытался прочитать этот файл и отправить данные в код JavaScript. Но это не работает.

Я думал использовать SQLite DB вместо хранения в файле, но я думаю, что при отправке данных из нативного кода в код JS возникнет та же проблема.

Не могли бы вы, ребята, предложить лучший подход.

1 ответ

Ваша проблема не будет решена, если вы сохраните данные в базе данных, если вам не понадобится весь файл сразу.

Если Сайт использует REST или аналогичные, и у вас есть доступ к коду, который вы можете перехватить запросы и отправить их на Java / Kotlin часть вашего приложения. В противном случае вы могли бы использовать WebViews interceptRequest,

Как только вы сможете получать запросы, вы можете вернуть необходимые данные из вашего database, Представьте, что вы представляете бэкэнд для сайта.

Пример: веб-сайт требует всех пользователей через GET users/all, Вы перехватываете этот запрос через ловушку, которая вызывает метод Java, а затем возвращает результат ИЛИ через interceptRequest. В любом случае у вас будет локальная база данных, в которой вы выполняете запрос, подобный (псевдокод): Select * from USER, Затем верните результат.

Поскольку вы имеете дело с JSON Вы могли бы использовать NOSQL база данных как CouchbaseLite который напрямую хранит JSON, Недостаток: если вам нужно изменить данные, вам придется преобразовать их в POJO и обратно к JSON как только вы вернете / сохраните его снова. Или используйте SQLite база данных. Для этого вам придется конвертировать JSON Вы скачиваете в POJOs а затем хранить их.

Было бы замечательно, если бы бэкэнд (откуда вы получили JSON) позволял вам получать разные типы моделей, а не все сразу (иначе вы можете столкнуться с проблемами с памятью). Вы могли бы использовать Retrofit для сетей и Moshi or Gson для вашего обращения в POJOs,

Если нет REST запросы или аналогичные, и вам нужен весь файл сразу. Честно говоря, я бы сказал, что нет способа справиться с этим как следует.

Другие вопросы по тегам