Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)
Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек
. В широких упрощенных терминах цикл событий подобен диспетчеру проекта, он постоянно прослушивает любые функции, которые хотят запускать и взаимодействовать между очереди и стека.
while (queue.waitForMessage()) {
queue.processNextMessage();
}
Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:
1. call foo.com/api/bar using foobarFunc
2. Go perform an infinite loop
... and so on
Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc
function foobarFunc (var) {
console.log(anotherFunction(var));
}
. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction
), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)
. Главное здесь - порядок выполнения. Это
Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.
Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.
Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done
deffered.fail
и deffered.always
(среди других). Вы можете увидеть их все здесь
Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.
Поскольку обратный вызов не выполняется немедленно, но в более позднее время важно передать ссылку на функцию, которую она не выполнила. поэтому
function foo(bla) {
console.log(bla)
}
, поэтому большую часть времени (но не всегда) вы пройдете foo
не foo()
. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.
Как сказано в комментариях, проверьте logcat. Что вы увидите, это исключение NullPointerException. У меня тоже было это.
Проверьте элементы, которые вы использовали в представлении в виджетах.
Объект RemoteViews (и, следовательно, виджет приложения) может поддерживать следующие классы макетов:
И следующие классы виджетов:
Использование запрещенных элементов вызывает это сообщение «Проблема загрузки виджета», не сказав, где это произошло.
У меня также была такая же проблема -
Я использовал android.support.constraint.ConstraintLayout, поэтому он сказал «Проблема с загрузкой виджета» после удаления этого и сменил на LinearLayout проблему, решенную как @Gangnus , говоря , он будет работать только для определенных видов.
У меня была такая же проблема, но logcat не показывал ничего подозрительного, ни ошибки, ни предупреждения. В основном, я вызывал неправильный метод, чтобы изменить цвет текста textview .
В основном виджеты заимствуют исключения. Просто установите соответствующий фильтр в вашем логарифме, и вы сможете увидеть, в чем проблема ...
Выше, я просто поиск слова «Виджет» и установка фильтра ни в одном конкретном приложении. Это по существу дает мне Throwable.getMessage()
без полной трассировки стека.
Конечно, используется прецедент, где на домашней странице загружен виджет, а затем пользователь удаляет приложение, содержащее виджет и приложение для настройки виджета.
Когда это произойдет, все, что вы см. «Проблема с загрузкой виджета» в виде тоста на главном экране. Насколько я могу судить, виджет не получает никаких указаний на то, что пакет удаляется, и я предполагаю, что домашний экран AppWidgetManager обрабатывает сообщение по умолчанию.
Непродуманное поведение со стороны ОС команда. Я предлагаю, чтобы было бы лучше вызвать методы onDisbled () и onDestroy () виджетов до того, как пакет будет удален, чтобы они могли при необходимости убирать, и пользователь (пользователь не-geek phone) получает чистый опыт.
Это может быть вызвано Moving of the specific (Widget) Application from Internal Memory to SD card
. ( Android - исправление ошибки «Загрузка загружаемого виджета» )
В моем случае ошибка была вызвана измененным именем класса поставщика. Поэтому, если вы изменили имя класса поставщика виджета, попробуйте изменить его. Кроме того, если вы изменили имена xml-файлов (например, widget_info.xml
, widget_layout.xml
), вы также захотите изменить их обратно.
Это произошло только тогда, когда пользователь обновил приложение и «старый Виджет в данный момент виден.
У меня была такая же проблема. Устранена проблема: я использовал пользовательский вид в виджетах. В моей ситуации это был TextView с пользовательским шрифтом.
Исправлен другой вариант этой ошибки, не упомянутый в других ответах.
Симптомы были: 1) Ошибка «Ошибка загрузки виджета» на Gingerbread и ниже 2). Точная же сборка отлично работала на ICS и Jellybean 3) Нет ошибок в logcat
Проблема была вызвана манипулированием представлением, которое никогда не накачалось в remoteviews. В частности:
remoteviews.setViewVisibility(viewId, View.GONE);
Если viewId был действительным ресурсом, но он был в макете, который никогда не добавлялся к удаленным представлениям. Ошибок не было, и виджет отобразил «Проблема с загрузкой виджета» после вызова .updateAppWidget ()
Проблема Загрузка результатов виджетов из проблемы / s в макете виджетов!
В виджете есть только ограниченный объем ресурсов. Убедитесь, что вы используете правильные элементы и их поля.
Объект RemoteViews (и, следовательно, виджет приложения) может поддерживать следующие классы ... классов:
AnalogClock Button ...
Моя проблема: у меня было поле этой кнопки, которое не поддерживалось
android:onClick="onClick"
Удаление этого параметра позволило отобразить виджет, где он был помещен (если он был помещен ранее) и в меню доступных виджетов.
Фактически установка
android:onClick=
для любогоView
приводит к этой ошибке.
Только для записи. У меня есть FrameLayout с TextView внутри, весь контент в LinerLayout, который будет заголовком моего виджета. Первоначально у меня было это
<LinearLayout
[...]
<FrameLayout
android:id="@+id/widget"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/app_name"
android:layout_margin="@dimen/activity_horizontal_margin"
android:textColor="@android:color/white"/>
</FrameLayout>
[...]
</LinearLayout>
. Как и все здесь, у меня появилось сообщение «Проблема загрузки виджета». Решением было изменение этого
android:layout_height="?attr/actionBarSize"
для этого:
android:layout_height="64dp"
Еще одна возможная причина этого:
Я видел это в журнале:
Не удалось разрешить атрибут
blockquote>проблема заключалась в том, что я пытался использовать цвет из текущей темы в качестве фона для одного из моих макетов.
, например
android:background="?themeColor"
Изменение этого на определенный цвет устраняло проблему .
android:background="@color/White"
Я также сталкиваюсь с этой проблемой, но только из-за сильной компоновки виджетов. Макет виджетов должен быть таким же легким, как вы можете создать. Теперь мой виджет работает идеально.
Объект RemoteViews (и, следовательно, виджет App) может поддерживать следующие классы макета:
FrameLayout
LinearLayout
RelativeLayout
GridLayout
И следующие классы виджетов:
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper
Все, что используется кроме вышеприведенного, вызывает так называемый «виджет загрузки задачи».
Кроме того, проверьте журналы (без фильтра), чтобы увидеть точную строку этой проблемы.
Я столкнулся с этой проблемой, потому что я пытался использовать Check-box!
Итак, просто remove checkbox
.
он будет работать нормально.
В моем случае у меня было плавающее textView
над другими видами. Решение проблемы с удалением его и мышлением о другом способе отображения моей информации пользователю с существующими представлениями, которые не перекрываются, было решением.
Так что не перекрывайте представления с помощью RelativeLayout
, я все еще использую его, и он работает, но представления не перекрываются как можно больше.
У меня такая же проблема, когда я удаляю приложение примечания, я пытаюсь прикоснуться и удерживать сообщение, и он показывает меню удаления, я выбираю удалить, чем он исчезает.