Sdscompany.ru

Компьютерный журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java lang illegalstateexception already tesselating

Ошибка Android: java.ленг.IllegalStateException: попытка запросить уже закрытый курсор

окружающая среда (Linux/Eclipse Dev для планшета Xoom под управлением HoneyComb 3.0.1)

в моем приложении я использую камеру (startIntentForResult ()), чтобы сделать снимок. После того, как снимок сделан, я получаю обратный вызов onActivityResult() и могу загрузить растровое изображение с помощью Uri, переданного через намерение «сфотографировать». В этот момент моя деятельность возобновляется, и я получаю ошибку, пытаясь перезагрузить изображения в галерею:

единственная логика курсора Я использую это после изображение берется я конвертирую Uri в файл, используя следующую логику

любые идеи, что я делаю неправильно?

6 ответов

похоже, что вызов managedQuery () устарел в API Honeycomb.

Doc для managedQuery () читает:

также я заметил, что вызываю курсор.close () после запроса, который, я думаю, является no-no. Нашел это очень полезная ссылка как хорошо. После некоторого чтения я придумал это изменение, которое, кажется, работает.

для записи, вот как я исправил это в своем коде (который работает на Android 1.6 и выше): проблема в моем случае заключалась в том, что я непреднамеренно закрывал управляемые курсоры, вызывая CursorAdapter.changeCursor(). Вызываю Активность.stopManagingCursor () на курсоре адаптера перед изменением курсора решил проблему:

исправить: используйте context.getContentResolver().query вместо activity.managedQuery .

я создал этот вопрос здесь, поскольку я не мог прокомментировать последний ответ (комментарии отключены по какой-то причине). Я думал, что открытие новой темы только усложнит ситуацию.

я получаю сбои приложений, когда я иду от Действие A to Действие B а затем вернуться к Действие A. Это не происходит все время — только иногда и мне трудно найти, где именно это происходит. Все происходит на то же устройство (Nexus S), но я не считаю, что это проблема устройства.

у меня есть несколько вопросов относительно ответа @Martin Stine.

  • в документации говорится о changeCursor(c); : «измените базовый курсор на новый курсор. Если есть существующий курсор, он будет закрыт». Так почему же я должен stopManagingCursor(currentCursor); — это не перебор?
  • когда я использую код, предлагаемый @Martin Stine, я получаю исключение нулевого указателя. Причина то есть, что в первом «запуске» приложения ((SimpleCursorAdapter)getListAdapter()) будет оцениваться как NULL, потому что курсор еще не был создан. Конечно, я мог бы проверить, не получаю ли я null и только затем попытаться остановить управление курсором, но, наконец, я решил поместить свой » stopManagingCursor(currentCursor); в метод onPause() этого действия. Я думал, что таким образом у меня наверняка будет курсор, чтобы перестать управлять, и я должен сделать это, прежде чем я оставлю действие другому. Проблема — я использую несколько курсоры (один для заполнения текста поля EditText, а другой для представления списка) в моей деятельности, я думаю, не все из них связаны с курсором ListAdapter —
    • как узнать, какой из них перестать управлять? Если у меня есть 3 разных списка?
    • должен ли я закрыть все из них во время onPause() ?
    • как получить список всех моих открытых курсоров?

так много вопросов. Надеюсь, кто-нибудь сможет помощь.

когда я доберусь до onPause() у меня есть курсор, чтобы остановить управление, но я еще не определил, решает ли это проблему, поскольку эта ошибка появляется спорадически.

ПОСЛЕ НЕКОТОРОГО РАССЛЕДОВАНИЯ:

я нашел кое-что интересное, что может дать ответ на «таинственную» сторону этого вопроса:

Activity A использует два курсора: один для заполнения поля EditText. Другой — заполнить ListView.

при переходе от действия A к действию B и возвращении поле + ListView в действии A должно быть заполнено снова. Похоже, что поле EditText никогда не будет иметь проблем с этим. Я не мог найти способ получить текущий курсор поля EditText (например, в Cursor currentCursor = ((SimpleCursorAdapter)getListAdapter()).getCursor(); ) и причина говорит мне, что поле EditText не будет его хранить. С другой стороны, ListView «запомнит» свой курсор с прошлого раза (до действия A -> действие B). Кроме того, и это странная вещь, Cursor currentCursor = ((SimpleCursorAdapter)getListAdapter()).getCursor(); будет иметь другой идентификатор после действия B — > Activity A и все это без меня всегда зовут

Я думаю, что в некоторых случаях, когда системе нужно освободить ресурсы, курсор будет убит, а когда действие B -> действие A, система все равно попытается использовать этот старый мертвый курсор, что приведет к исключению. И в других случаях система придумает новый курсор, который все еще жив, и, таким образом, никаких исключений не произойдет. Это может объяснить, почему это появляется только иногда. Я думаю, это трудно отладить из-за разницы в скорости приложения при запуске или отладке приложения. При отладке требуется больше времени и, таким образом, может дать системе время придумать новый курсор или наоборот.

в моем понимании это делает использование

как рекомендовано @Martin Stine a должны в некоторых случаях и резервные in Другие: если я возвращаюсь к методу, и система пытается использовать мертвый курсор, необходимо создать новый курсор и заменить его в ListAdapter, иначе я получаю сердитых пользователей приложения с разбитым приложением. В другом случае, когда система найдет себе новый курсор — строки выше избыточны, поскольку они аннулируют хороший курсор и создают новый.

Я думаю, чтобы предотвратить эту избыточность, мне нужно что-то вроде этого:

Получение ошибки «Java.lang.IllegalStateException Activity has been destroyed» при использовании вкладок с ViewPager

У меня есть приложение, которое состоит из использования ActionBarSherlock в режиме tab. У меня есть 5 вкладок, и содержимое каждой вкладки обрабатывается с помощью фрагментов. Однако для tab2 у меня есть фрагмент, файл xml которого содержит элемент ViewPager, который, в свою очередь, содержит несколько страниц фрагментов. Когда я изначально запускаю приложение the application, я могу переключаться между вкладками без проблем, но когда я нажимаю на tab2 во второй раз, я получаю ошибку, упомянутую выше. Основная деятельность заключается в следующем:

Читать еще:  Ошибка аутентификации вай фай что значит

Класс фрагмента без ViewPager выглядит следующим образом:

Класс фрагмента с ViewPager выглядит следующим образом:

Из того, что я прочитал в разных местах (и, пожалуйста, поправьте меня, если я ошибаюсь), это происходит потому, что менеджер фрагментов на втором проходе пытается повторно использовать фрагменты из действия, которое больше не существует, таким образом давая ошибку. Но я не уверен, почему это происходит здесь, так как я не использую фрагментную активность. Согласно logcat ошибка находится в классе Tab2, onViewCreated метод в строке, которая говорит mViewPager.setAdapter(mMyFragmentPagerAdapter). Любая помощь очень важна appreciated. Thanks.

12 Ответов

Похоже, это ошибка в недавно добавленной поддержке вложенных фрагментов. В основном, ребенок FragmentManager заканчивается с нарушенным внутренним состоянием, когда он отрывается от деятельности. Кратковременный обходной путь, который исправил это для меня, состоит в том, чтобы добавить следующее к onDetach() каждого Fragment , который вы называете getChildFragmentManager() на:

У меня точно такая же проблема. Единственное решение, которое я нашел, заключается в замене фрагментов новым экземпляром, каждый раз, когда вкладки меняются.

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

Я столкнулся с той же проблемой при вызове super.onCreate() в конце моего метода. Причина: attachActivity() называется в onCreate() из FragmentActivity. При переопределении onCreate() и, например, создании вкладок менеджер вкладок попытается переключиться на фрагмент, не имея действия, прикрепленного к FragmentManager.

Простое решение: переместите вызов на super.onCreate() в начало тела функции.

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

Хотел добавить, что моя проблема заключалась в том, что я пытался сделать FragmentTransaction в onCreate, прежде чем позвонить super.onCreate() . Я просто переместил super.onCreate() на вершину функции и работал нормально.

У меня была эта ошибка, потому что я использовал LocalBroadcastManager, и я сделал это:

Я столкнулся с той же проблемой и позже узнал, что я пропустил звонок в super.onCreate( savedInstanceState ); в onCreate() из FragmentActivity.

Я получил ту же самую ошибку, когда пытался получить доступ к дочернему FragmentManager до того, как фрагмент был полностью инициализирован (т. е. прикреплен к действию или по крайней мере вызван onCreateView() ). В противном случае FragmentManager инициализируется с помощью действия null , вызывающего вышеупомянутое исключение.

Я заставляю фрагмент, содержащий дочерний фрагмент, быть NULL в onPause, и это исправляет мою проблему

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

Вот что я сделал:

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

У меня был такой код:

и решил проблему, удалив строку » onDestroy();»

Причина, по которой я написал начальный код: Я знаю, что при выполнении «finish()» действие вызывает «onDestroy()», но я использую потоки, и я хотел убедиться, что все потоки будут уничтожены перед началом следующего действия, и похоже, что «finish()» не всегда является немедленным. Мне нужно обработать / уменьшить много “Bitmap” и отобразить большой “bitmaps”, и я работаю над улучшением использования памяти в моем приложении

Теперь я буду убивать потоки, используя другой метод, и я выполню этот метод из «onDestroy();» и когда я думаю, что мне нужно убить все потоки.

У меня была эта проблема, и я понял, что это было потому, что я звонил setContentView(int id) дважды в моем Activity ‘ s onCreate

Этот парень сводил меня с ума на протяжении 51 года.

Я столкнулся с этим с реализацией ViewPager для TabLayout WITHIN фрагмента, который сам реализован в DrawerLayout:

Таким образом, вы должны реализовать следующий код в вашем DrawerFragment . Будьте внимательны, чтобы выбрать правильный FragmentManager-путь. Потому что у вас могут быть две разные ссылки FragmentManager:

—> Выберите тот, который вы используете. Если вы хотите использовать ChildFragmentManager, вы должны были использовать объявление класса Android.App.FragmentManager для вашего ViewPager!

Android.Support.V4.App.FragmentManager

Реализуйте следующий метод в вашем фрагменте «Main» — в этом примере: DrawerFragment

Android.App.FragmentManager

Это означает, что вы должны были инить ViewPager с Android.App.FragmentManager.

Реализуйте следующий метод в вашем фрагменте «Main» — в этом примере: DrawerFragment

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

Ниже я пытался работать с Facebook SDK в то время как я столкнулся с этой проблемой, каждый раз, когда я запускаю приведенный ниже код, я, кажется, получаю ошибку java.lang.IllegalStateException.

У меня есть действие Maps (SherlockFragmentActivity), которое загружается в Фрагмент карт, который имеет 2 кнопки и переключается между отображением 2 разных фрагментов (GoogleMapFragment &.

Читать еще:  Метод гаусса java

Поэтому я пытался реализовать функцию в своем приложении, где, когда я нажимаю имя пользователя из searchBoxResultsFragment , которое было фрагментом, показывающим Результаты поиска пользователя, он.

Я получаю эти ошибки при запуске приложения ToolTwist в рабочей среде. Это, кажется, происходит само собой. Каковы возможные ошибки кода, которые могут привести к этим трассировкам стека? 2012-02-13.

Мое приложение получает все изображения URL с сервера и сохраняет их в ArrayList и отображает эти изображения в ViewPager . Но он генерирует IllegalStateException . Адаптер приведен ниже: public.

CREATE OR REPLACE FUNCTION get_biggest_order() RETURNS TABLE(CustomerID int,Sum float) AS $$ DECLARE rec RECORD; mycursor CURSOR FOR WITH TOTAL(TotalPerCustomer) AS (SELECT SUM(TotalDue) FROM.

Как избавиться от этого, Я использую библиотеку совместимости Google для фрагментов. У меня есть следующая ошибка в журнале cat. Где MainMenuScreen — это FragmentActivity.

Я сделал очень простое действие , которое показывает простой ListFragment , как показано ниже: моя деятельность: public class MyActivity extends FragmentActivity < @Override public void.

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

Android 8.0: java.ленг.IllegalStateException: не допускается, чтобы начать обслуживание намерениях

при запуске приложения приложение запускает службу, которая должна выполнять некоторые сетевые задачи. После таргетинга на уровень API 26 мое приложение не может запустить службу на Android 8.0 в фоновом режиме.

вызвано: java.ленг.IllegalStateException: не разрешено запускать намерение обслуживания < СМР=мой.приложение.ТТ/сом.мой.услуги >: приложение находится в фоновом режиме uid UidRecord

метод startService () теперь создает исключение IllegalStateException, если приложение для Android 8.0 пытается использовать этот метод в ситуации, когда не разрешается создавать фоновые службы.

«в ситуации, когда это не допускается» — что это значит?? И как это исправить. Я не хочу, чтобы мой сервис был «передним планом»

12 ответов:

разрешенные ситуации являются временным белым списком, где фоновая служба ведет себя так же, как и раньше Android O.

при определенных обстоятельствах фоновое приложение помещается во временный белый список на несколько минут. В то время как приложение находится в белом списке, оно может запускать службы без ограничений, и его фоновые службы разрешены для запуска. Приложение помещается в белый список, когда оно обрабатывает задачу, которая видна пользователю, например как:

  • работа с высоким приоритетом облако опорного пункта обмена сообщениями (сообщение ФКМ).
  • получение широковещательной передачи, например SMS / MMS сообщения.
  • выполнение PendingIntent из уведомления.
  • запуск VpnService до того, как приложение VPN продвигается на передний план.

другими словами, если ваш фон сервис не соответствует требованиям белого списка вы должны использовать новый JobScheduler. Это в основном то же самое, что и фоновая служба, но она вызывается периодически, а не работает в фоновом режиме непрерывно.

у меня есть решение. Для устройств до 8.0, вы должны просто использовать startService() , но для устройств после 7.0 вы должны использовать startForgroundService() . Вот пример кода для запуска службы.

и в классе обслуживания, пожалуйста, добавьте код ниже для уведомления:

где O-версия Android 26.

надеюсь, что это будет решать IllegalArgumentException

если служба работает в фоновом потоке путем расширения IntentService , вы можете заменить IntentService с JobIntentService который предоставляется как часть библиотеки поддержки Android

преимущества использования JobIntentService есть, он ведет себя как IntentService на устройствах pre-O и на O и выше он отправляет его как задание

JobScheduler может также использоваться для периодических / по требованию заданий. Но, убедитесь, чтобы обрабатывать обратную совместимость как JobScheduler API доступен только из API 21

лучший способ-использовать JobIntentService который использует новый JobScheduler для Oreo или старые услуги, если они недоступны.

объявите в своем манифесте:

и в вашем сервисе вы должны заменить onHandleIntent на onHandleWork:

затем вы начинаете свою службу с:

Да, это потому, что вы больше не можете запускать службы в фоновом режиме на API 26. Таким образом, Вы можете запустить ForegroundService выше API 26.

вам придется использовать

и отправить уведомление во время обработки утечки.

С примечания к выпуску firebase, Они утверждают, что поддержка Android O была впервые выпущена в 10.2.1 (хотя я бы рекомендовал использовать самую последнюю версию).

пожалуйста, добавьте новые зависимости обмена сообщениями firebase для android O

при необходимости обновите сервисы google play и репозитории google.

Если вы интегрировали Firebase messaging push notification, то

добавить новые / обновить firebase зависимости обмена сообщениями для android O (Android 8.0), из-за Ограничения Фонового Выполнения.

при необходимости обновите сервисы google play и репозитории google.

обновление:

использовать startForegroundService() вместо startService() и не забудьте создать startForeground(1,new Notification()); в вашем обслуживании в течение 5 секунд после начала обслуживания.

другие ответы все правильные, но я хотел бы отметить, что еще один способ обойти это-попросить пользователя отключить оптимизацию батареи для вашего приложения (обычно это не очень хорошая идея, если ваше приложение не связано с системой). Смотрите ответ для того, как запросить, чтобы отказаться от оптимизации батареи, не получая ваше приложение запрещено в Google Play.

вы также должны проверить, отключена ли оптимизация батареи в вашем приемнике, чтобы предотвратить сбои через:

Если вы используете свой код на 8.0, то приложение рухнет. Так что начните службу на переднем плане. Если ниже 8.0 используйте это :

Читать еще:  Java encoding utf 8

Если выше или 8.0, то используйте это:

— первый метод вызова в стартовом приложении или основной деятельности:

— второй, когда закрыть приложение и firebase push:

— последний дескриптор в файл:

Handling IllegalStateException: Can not perform this action after onSaveInstanceState

Have you ever came across this error? If you have not seen it yourselves, you might have seen it in your crash analysis report e.g. Fabric Crashlytic.

Most people would just google and found the Stackoverflow answer

IllegalStateException: Can not perform this action after onSaveInstanceState with ViewPager

I’m getting user reports from my app in the market, delivering the following exception…

stackoverflow.com

And simply change

That’s all okay now, no more crash! But…

A better way of solving

As usual, the procedure to solve a problem is 1. Replicating It, 2. Understanding It, 3. Fixing It.

Replicate it

The most difficult part of this problem is, replicating it. One of the cause many people resort to using commitAllowingStateLoss is, this problem is hard to replicate.

I have created a way to replicate this consistently in one of my demo project.

elye/demo_android_handling_commit_after_onsavedstateinstances_error

demo_android_handling_commit_after_onsavedstateinstances_error — Showing a way to replicate IllegalStateException: Can…

github.com

After compile, and just perform the steps as per the video below. You’ll see it occurs consistently. Note: If the error doesn’t happen, you have to ensure you don’t have Don’t Keep Activity setting ON..

In short, every time you change your Location Setting externally, it will crash.

Understanding it

You could try debugging it yourselves to see what cause the problem… as long as don’t use commitAllowingStateLoss() to solve it 😝

If you are lazy to try it out yourselves, let me help you here. Add the below code to it.

After that follow the step again to replicate the problem (you could uninstall and reinstall to follow the exact step). You’ll see the log as below.

The main cost of the problem is the fragment transaction is commit() after onSaveInstanceState() is called.

This is something undesirable, as that means your final state is not saved before you change Fragment. (but it is okay if you don’t care… that’s why Google provides commitAllowingStateLoss() )

So in short, if you ever see this happens on your end, it’s likely that some of your fragment transaction is called after onSaveInstanceState() . You’ll need to then debug your flow see how that could occurs.

Fixing it

Understanding how this happens, we’ll look at the flow of our program.

When the program first start, it will call the below twice

due to the checkPermissionAndRequest() functionality.

When user click OPEN LOCATION Page, it will perform the below

  • The onPause which trigger locationManager.removeSwitchStateReceiver()
  • The onSaveInstanceState() as it is existing the App.

Because it has called twice locationManager.locatioDetection which register the location listener twice, but only call the removeSwitchStateReceiver once, hence one of the registered location change listener is not unregister upon exiting the App.

When the user change the Location Setting, it will then trigger the call of onResume() again, even after onSaveInstanceState() is called.

Hence this will trigger the Fragment commit() , which cause the crash

To fix this problem properly, we’ll just need to remove the Location Change Listener when a new Location Listener is setup, as per the bold code below.

Java lang illegalstateexception already tesselating

and i got this exception

Servlet failed with Exception
java.lang.IllegalStateException: Response already committed
at weblogic.servlet.internal.ServletResponseImpl.objectIfCommitted(ServletResponseImpl.java:1608)
at weblogic.servlet.internal.ServletResponseImpl.sendRedirect(ServletResponseImpl.java:834)
at com.diy.controller.LoginServlet.doPost(LoginServlet.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:111)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:313)
at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:413)
at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:94)
at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:161)
at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:71)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:136)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)

Response already committed means that
— you have called «response.flushBuffer()» or similar
— you have output more than the responses buffer and it has been automatically flushed for you.

Basically if you have already started writing out your response, you are committed. You can’t change your mind and say «go over there» instead.
I can’t see anywhere in the code you are outputting stuff, but you DO call out.close.
Where does this «out» come from? What have you been doing with it up until now?

Which one of these response.sendRedirects() corresponds to LoginServlet line 56?

I believe that once you have called sendRedirect then the response is committed and you can’t write anything else to it. In particular you can’t call sendRedirect again. So my theory is that sendRedirect is called at line 12 (of the posted code) and again at line 27.

(Also I’m going to move this post from JSP to Servlets since it’s about servlets.)

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector