Как отправить большие данные из нативной 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
запросы или аналогичные, и вам нужен весь файл сразу. Честно говоря, я бы сказал, что нет способа справиться с этим как следует.