пешеходный переход в Ionic2 увеличивает размер приложения на 25 МБ [дубликат]

В следующем примере, который я написал, показано, как

  • обрабатывать асинхронные HTTP-вызовы;
  • Подождать ответа от каждого вызова API;
  • Использовать шаблон promise ;
  • Используйте шаблон Promise.All для объединения нескольких HTTP-вызовов;

Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект window XMLHttpRequest для совершения вызовов. Он будет определять простую функцию, чтобы дождаться завершения кучи обещаний.

Контекст. В этом примере запрашивается конечная точка Spotify Web API для поиска объектов playlist для заданного набора строк запроса:

[
 "search?type=playlist&q=%22doom%20metal%22",
 "search?type=playlist&q=Adele"
]

Для каждого элемента новый Promise запустит блок - ExecutionBlock, проанализирует результат, заплатит новый набор обещаний на основе массива результатов, который представляет собой список объектов Spotify user и выполняет новый HTTP-вызов в ExecutionProfileBlock асинхронно.

Затем вы можете увидеть вложенную структуру Promise, которая позволяет вам генерировать множественные и полностью асинхронные вложенные HTTP-вызовы и присоединять результаты к каждому подмножеству вызовов через Promise.all.

NOTE Recent Spotify search API-интерфейсам потребуется указать токен доступа в заголовках запроса:

-H "Authorization: Bearer {your access token}" 

Итак, вы должны запустить следующий пример, вам нужно поместить маркер доступа в заголовки запроса:

var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
    log: function(s) {
        document.getElementById("console").innerHTML += s + "
" } } // Simple XMLHttpRequest // based on https://davidwalsh.name/xmlhttprequest SimpleRequest = { call: function(what, response) { var request; if (window.XMLHttpRequest) { // Mozilla, Safari, ... request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Internet Explorer try { request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } // State changes request.onreadystatechange = function() { if (request.readyState === 4) { // Done if (request.status === 200) { // Complete response(request.responseText) } else response(); } } request.open('GET', what, true); request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken); request.send(null); } } //PromiseAll var promiseAll = function(items, block, done, fail) { var self = this; var promises = [], index = 0; items.forEach(function(item) { promises.push(function(item, i) { return new Promise(function(resolve, reject) { if (block) { block.apply(this, [item, index, resolve, reject]); } }); }(item, ++index)) }); Promise.all(promises).then(function AcceptHandler(results) { if (done) done(results); }, function ErrorHandler(error) { if (fail) fail(error); }); }; //promiseAll // LP: deferred execution block var ExecutionBlock = function(item, index, resolve, reject) { var url = "https://api.spotify.com/v1/" url += item; console.log( url ) SimpleRequest.call(url, function(result) { if (result) { var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) { return item.owner.href; }) resolve(profileUrls); } else { reject(new Error("call error")); } }) } arr = [ "search?type=playlist&q=%22doom%20metal%22", "search?type=playlist&q=Adele" ] promiseAll(arr, function(item, index, resolve, reject) { console.log("Making request [" + index + "]") ExecutionBlock(item, index, resolve, reject); }, function(results) { // Aggregated results console.log("All profiles received " + results.length); //console.log(JSON.stringify(results[0], null, 2)); ///// promiseall again var ExecutionProfileBlock = function(item, index, resolve, reject) { SimpleRequest.call(item, function(result) { if (result) { var obj = JSON.parse(result); resolve({ name: obj.display_name, followers: obj.followers.total, url: obj.href }); } //result }) } //ExecutionProfileBlock promiseAll(results[0], function(item, index, resolve, reject) { //console.log("Making request [" + index + "] " + item) ExecutionProfileBlock(item, index, resolve, reject); }, function(results) { // aggregated results console.log("All response received " + results.length); console.log(JSON.stringify(results, null, 2)); } , function(error) { // Error console.log(error); }) ///// }, function(error) { // Error console.log(error); });

Я подробно рассмотрел это решение здесь .

4
задан James J 22 May 2015 в 07:41
поделиться

3 ответа

Я тоже сталкиваюсь с этой проблемой. К сожалению, использование пешеходного перехода определенно увеличит ваш размер APK. Тем не менее, я нашел способ уменьшить размер apk. Например, вы могли бы использовать перекресток. Это может снизить ваш размер apk примерно на 15 МБ (см. crosswalk lite ). Вы также можете указать, что вы не хотите создавать проекты для двух архитектур (объяснил здесь ).

3
ответ дан andreaspfr 27 August 2018 в 07:44
поделиться

Я думаю, что проблема, с которой вы сталкиваетесь, связанная с Crosswalk, связана с эмуляцией. Я пробовал эмуляторы как из версий Android Studio, так и из Genymotion. Они оба плохо работали для тестирования гибридных приложений.

. Мой совет - попробовать Chrome Device Inspector вместе с фактическим тестированием устройства. Я не думаю, что кто-то будет утверждать, что это лучший способ обеспечить производительность. AWS Device Farm - это лишь одно из множества предложений, которые будут выплюнуть физические устройства для тестирования. Есть даже службы, которые позволяют вам проводить аутсорсинг на разных устройствах реальными людьми, просто не могу придумать его имя прямо сейчас ...

Моим текущим фаворитом является Кордова Инструменты для Visual Studio Code , но в последнее время это было неудобно для меня.


Тем не менее, я нахожусь на ранних стадиях флота приложений в Кордове и был встревожен накладной Crosswalk. ~20MB дополнительно к вашим APK, а ~70MB - к установленному размеру вашего приложения. Это довольно тревожно, учитывая, что приложения, с которыми мы его используем, с ресурсами ресурсов (изображениями и т. Д.) Составляют примерно 1/10 размера этого плагина!

У нас есть одно приложение, которое на самом деле деградировал с помощью Crosswalk. Моя теория заключается в том, что Crosswalk не очень хорошо разбирается в нестандартном HTML-анализе, который является основной функцией, с которой мы имеем XSLT-преобразованный XML, который заканчивается нестандартным HTML. Перемещение происходит очень медленно по сравнению с WebView по умолчанию. Мы делаем много манипуляций с исходными DocumentNode объектами, так что, возможно, это все. Тем не менее, я так удивлен, что если медленное перемещение / добавление HTML через ванильный JavaScript, что эти другие приложения видят прирост производительности!

Я также узнал вчера, что существует Общий режим с Crosswalk , который позволяет нескольким приложениям использовать Crosswalk для совместного использования одного экземпляра.

2
ответ дан EHorodyski 27 August 2018 в 07:44
поделиться

Та же проблема здесь. Я думаю, что обещанный размер 20 Мб для сжатого файла apk, вы смотрите на установленный размер на устройстве.

Вы можете проверить сгенерированный размер APK на platforms/android/build/outputs/apk/ или platforms/android/ant-build/

2
ответ дан Fernando Fabreti 27 August 2018 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: