Я испытываю довольно странную ошибку, что иногда происходило в C ++, но я думал, что в Java невозможно. Деятельность запускает сервис и дает ему намерение с короткой строкой (да / нет, на самом деле это логическое, но должно быть предоставлено в виде текста) в текстовом поле. Служба сохраняет строку в собственном поле.
До сих пор ничего необычного.
Заявление может остановить службу и начать его снова.
Проблема заключается в том, что я остановлюсь и запускаю службу с действия, в какой -то момент она выглядит как содержание сохраненного текстового поля модифицируется чем -то другим, чем мой код. Сервис устанавливает его на «да» в OnStartCommand, а затем, когда она должна использовать его через некоторое время, он находит в этом «нет». Вместо этого. Это происходит последовательно после того, как я остановлюсь и запускаю его снова. Может ли это произойти в Java, что поле изменяется за пределами кода, так сказать, по ошибке кучи? Я думаю о чем -то, что пишет вне границ, или текстовую область, которая неправильно освобождена, а затем перезаписана. Как и в C ++.
Кроме того, это почти наверняка не ошибка в памяти. Во -первых, мое приложение очень мало на данный момент, и на тестовом устройстве много памяти, и во -вторых, я не получаю никакого исключения. В конце OnStartCommand строка - это да, и когда начинается обработчик. Handlemessage, это нет. В промежутке нет другого кода из моего приложения под названием. В случае, если кто -то хочет проверить его и попытаться выяснить, в чем на самом деле проблема. Вы заметите, что он действительно звучит в первый раз, когда служба запускается, затем после того, как она остановлена и перезапущена. Вам придется интегрировать его в проект и запустить и остановить его от действия. ("com.service.showonlockscreen", "нет"); < /p>
Я оставил вызовы там, чтобы Logmessage, в значительных кодовых точках, если они вам нужны. Но функция logmessage пуста, вы должны предоставить свой собственный код (или использовать другой метод отслеживания или отладки). < /P>
Вы заметите некоторые комментарии на румынском языке. Извините, но я не переводил их на английский. Если вам любопытно, вам придется использовать Google Translate. Если вам это пострят, он будет исправлен, и он будет звучать каждый раз, когда он останавливается и перезапускается. (Примечание: Создайте сервис в своем собственном процессе, в противном случае деятельность тоже будет убита.) < /P>
public class TestService extends Service
{
@Override
public IBinder onBind(Intent intent) {
return null;
}
void LogMessage (String aMessage)
{
}
void SavePersistentSettingInt (String aSetting, int aValue)
{
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences (this);
SharedPreferences.Editor editor = settings.edit ();
editor.putInt (aSetting, aValue);
editor.commit(); // asa se face ca sa-l salveze pe disc
}
int GetPersistentSettingInt (String aSetting, int aDefaultValue)
{
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences (this);
return settings.getInt (aSetting, aDefaultValue);
}
int mShowOnLockScreen = -1;
void SetShowOnLockScreen (String aChecked) // "yes" / "no"
{
LogMessage ("SetShowOnLockScreen " + aChecked);
mShowOnLockScreen = aChecked.equals ("yes") ? 1 : 0;
SavePersistentSettingInt ("showOnLockScreen", mShowOnLockScreen);
LogMessage ("mSOLS after SetShowOnLockScreen " + mShowOnLockScreen);
}
int ShowOnLockScreenValue ()
{
if (mShowOnLockScreen == -1)
mShowOnLockScreen = GetPersistentSettingInt (
"showOnLockScreen", 0);
LogMessage ("ShowOnLockScreenValue " + mShowOnLockScreen);
return mShowOnLockScreen;
}
boolean IsSetShowOnLockScreen ()
{
return ShowOnLockScreenValue() == 1;
}
/* TONE_CDMA_ALERT_INCALL_LITE = 91;
TONE_CDMA_EMERGENCY_RINGBACK = 92;
TONE_CDMA_ALERT_CALL_GUARD = 93;
TONE_CDMA_SOFT_ERROR_LITE = 94;
*/
private static void beep (int aVolume, int aDuration, int aTone)
{
ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, aVolume);
toneG.startTone(aTone, aDuration);
}
private static void beep (int aVolume, int aDuration)
{
beep (aVolume, aDuration, TONE_CDMA_ALERT_CALL_GUARD);
}
@Override
public void onCreate ()
{
LogMessage ("onCreate called");
// cica nu e nevoie sa apelezi in servicii (dar se pare ca nici nu strica)
// super.onCreate();
/* Si atit.
Restul se face in InitialiseService care se apeleaza din onStartCommand. Pentru ca
onCreate se apeleaza inainte de onStartCommand, dar parametrul, adica Intent-ul, ca sa
stii cine dracu te-a apelat, se da de-abia in onStartCommand . In speta, in primul
rind notificarea nu tb. data cind serviciul e pornit aut. la boot dar SOLS e off.
Iar celelalte e mai bine sa fie date dupa notificare, wake lock-ul deasemenea mai
bine nu-l ocupi daca n-ai nevoie de el.
Puteam sa incerc niste scheme mai complicate un pic dar nu merita, mai bine reorg.
codul in felul asta.
*/
}
void InitialiseService ()
{
// construim mTimerHandler si ii dam primul mesaj
try {
if (mTimerHandler == null)
mTimerHandler = NewTimerHandler ();
mTimerHandler.sendMessageDelayed (
mTimerHandler.obtainMessage (Event1), 1000); // 1 sec
}
catch (Exception e)
{
beep (200, 400);
}
}
@Override
public void onDestroy ()
{
LogMessage ("onDestroy called");
// cica nu e nevoie sa apelezi in servicii (dar se pare ca nici nu strica)
// super.onDestroy ();
if (mTimerHandler != null)
{
LogMessage ("removeCallbacksAndMessages called");
mTimerHandler.removeCallbacksAndMessages (null);
}
//Process.killProcess (Process.myPid());
}
@Override
public int onStartCommand (Intent aIntent, int flags, int startId)
{
LogMessage ("onStartCommand called");
if (aIntent == null)
return START_STICKY;
String s = aIntent.getStringExtra ("com.service.showOnLockScreen");
if (s != null)
SetShowOnLockScreen (s);
LogMessage ("SOLS in onStartCommand after SetShowOnLockScreen: " + mShowOnLockScreen);
if (IsSetShowOnLockScreen ())
InitialiseService ();
else
{
stopSelf ();
return START_NOT_STICKY;
}
LogMessage ("SOLS after InitializeService: " + mShowOnLockScreen);
// If we get killed, after returning from here, restart
return START_STICKY;
}
int GetCurrentSecond ()
{
return Calendar.getInstance().get (Calendar.SECOND);
}
final static int Event1 = 0;
private static Handler mTimerHandler = null;
Handler NewTimerHandler ()
{
return new Handler (Looper.getMainLooper ())
{
@Override
public void handleMessage (@NonNull Message msg)
{
LogMessage ("SOLS at begin of handleMessage: " + mShowOnLockScreen);
try {
if (msg.what == Event1)
{
// trimitem noul mesj un pic dupa inceperea minutului urmator
int delay = 60 - GetCurrentSecond ();
if (delay < 10)
delay = 10; // lasam cel putin 10 secunde
sendMessageDelayed (obtainMessage (Event1),
delay * 1000); // la inc. min. urmator
//beep (200, 200, TONE_CDMA_ALERT_CALL_GUARD);
LogMessage ("SOLS before main action: " + mShowOnLockScreen);
if (IsSetShowOnLockScreen ())
// uneori vine mesaj de handler si dupa ce s-a dat comanda de
// auto-distrugere
beep (100, 200);
}
else
{
beep (200, 400);
}
}
catch (Exception e)
{
beep (200, 400);
}
}
};
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... de-of-code
Поле обслуживания Android, которое, кажется, изменяется вне кода ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1749605069
Anonymous
Я испытываю довольно странную ошибку, что иногда происходило в C ++, но я думал, что в Java невозможно. Деятельность запускает сервис и дает ему намерение с короткой строкой (да / нет, на самом деле это логическое, но должно быть предоставлено в виде текста) в текстовом поле. Служба сохраняет строку в собственном поле.
До сих пор ничего необычного.
Заявление может остановить службу и начать его снова.
Проблема заключается в том, что я остановлюсь и запускаю службу с действия, в какой -то момент она выглядит как содержание сохраненного текстового поля модифицируется чем -то другим, чем мой код. Сервис устанавливает его на «да» в OnStartCommand, а затем, когда она должна использовать его через некоторое время, он находит в этом «нет». Вместо этого. Это происходит последовательно после того, как я остановлюсь и запускаю его снова. Может ли это произойти в Java, что поле изменяется за пределами кода, так сказать, по ошибке кучи? Я думаю о чем -то, что пишет вне границ, или текстовую область, которая неправильно освобождена, а затем перезаписана. Как и в C ++.
Кроме того, это почти наверняка не ошибка в памяти. Во -первых, мое приложение очень мало на данный момент, и на тестовом устройстве много памяти, и во -вторых, я не получаю никакого исключения. В конце OnStartCommand строка - это да, и когда начинается обработчик. Handlemessage, это нет. В промежутке нет другого кода из моего приложения под названием. В случае, если кто -то хочет проверить его и попытаться выяснить, в чем на самом деле проблема. Вы заметите, что он действительно звучит в первый раз, когда служба запускается, затем после того, как она остановлена и перезапущена. Вам придется интегрировать его в проект и запустить и остановить его от действия. ("com.service.showonlockscreen", "нет"); < /p>
Я оставил вызовы там, чтобы Logmessage, в значительных кодовых точках, если они вам нужны. Но функция logmessage пуста, вы должны предоставить свой собственный код (или использовать другой метод отслеживания или отладки). < /P>
Вы заметите некоторые комментарии на румынском языке. Извините, но я не переводил их на английский. Если вам любопытно, вам придется использовать Google Translate. Если вам это пострят, он будет исправлен, и он будет звучать каждый раз, когда он останавливается и перезапускается. (Примечание: Создайте сервис в своем собственном процессе, в противном случае деятельность тоже будет убита.) < /P>
public class TestService extends Service
{
@Override
public IBinder onBind(Intent intent) {
return null;
}
void LogMessage (String aMessage)
{
}
void SavePersistentSettingInt (String aSetting, int aValue)
{
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences (this);
SharedPreferences.Editor editor = settings.edit ();
editor.putInt (aSetting, aValue);
editor.commit(); // asa se face ca sa-l salveze pe disc
}
int GetPersistentSettingInt (String aSetting, int aDefaultValue)
{
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences (this);
return settings.getInt (aSetting, aDefaultValue);
}
int mShowOnLockScreen = -1;
void SetShowOnLockScreen (String aChecked) // "yes" / "no"
{
LogMessage ("SetShowOnLockScreen " + aChecked);
mShowOnLockScreen = aChecked.equals ("yes") ? 1 : 0;
SavePersistentSettingInt ("showOnLockScreen", mShowOnLockScreen);
LogMessage ("mSOLS after SetShowOnLockScreen " + mShowOnLockScreen);
}
int ShowOnLockScreenValue ()
{
if (mShowOnLockScreen == -1)
mShowOnLockScreen = GetPersistentSettingInt (
"showOnLockScreen", 0);
LogMessage ("ShowOnLockScreenValue " + mShowOnLockScreen);
return mShowOnLockScreen;
}
boolean IsSetShowOnLockScreen ()
{
return ShowOnLockScreenValue() == 1;
}
/* TONE_CDMA_ALERT_INCALL_LITE = 91;
TONE_CDMA_EMERGENCY_RINGBACK = 92;
TONE_CDMA_ALERT_CALL_GUARD = 93;
TONE_CDMA_SOFT_ERROR_LITE = 94;
*/
private static void beep (int aVolume, int aDuration, int aTone)
{
ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, aVolume);
toneG.startTone(aTone, aDuration);
}
private static void beep (int aVolume, int aDuration)
{
beep (aVolume, aDuration, TONE_CDMA_ALERT_CALL_GUARD);
}
@Override
public void onCreate ()
{
LogMessage ("onCreate called");
// cica nu e nevoie sa apelezi in servicii (dar se pare ca nici nu strica)
// super.onCreate();
/* Si atit.
Restul se face in InitialiseService care se apeleaza din onStartCommand. Pentru ca
onCreate se apeleaza inainte de onStartCommand, dar parametrul, adica Intent-ul, ca sa
stii cine dracu te-a apelat, se da de-abia in onStartCommand . In speta, in primul
rind notificarea nu tb. data cind serviciul e pornit aut. la boot dar SOLS e off.
Iar celelalte e mai bine sa fie date dupa notificare, wake lock-ul deasemenea mai
bine nu-l ocupi daca n-ai nevoie de el.
Puteam sa incerc niste scheme mai complicate un pic dar nu merita, mai bine reorg.
codul in felul asta.
*/
}
void InitialiseService ()
{
// construim mTimerHandler si ii dam primul mesaj
try {
if (mTimerHandler == null)
mTimerHandler = NewTimerHandler ();
mTimerHandler.sendMessageDelayed (
mTimerHandler.obtainMessage (Event1), 1000); // 1 sec
}
catch (Exception e)
{
beep (200, 400);
}
}
@Override
public void onDestroy ()
{
LogMessage ("onDestroy called");
// cica nu e nevoie sa apelezi in servicii (dar se pare ca nici nu strica)
// super.onDestroy ();
if (mTimerHandler != null)
{
LogMessage ("removeCallbacksAndMessages called");
mTimerHandler.removeCallbacksAndMessages (null);
}
//Process.killProcess (Process.myPid());
}
@Override
public int onStartCommand (Intent aIntent, int flags, int startId)
{
LogMessage ("onStartCommand called");
if (aIntent == null)
return START_STICKY;
String s = aIntent.getStringExtra ("com.service.showOnLockScreen");
if (s != null)
SetShowOnLockScreen (s);
LogMessage ("SOLS in onStartCommand after SetShowOnLockScreen: " + mShowOnLockScreen);
if (IsSetShowOnLockScreen ())
InitialiseService ();
else
{
stopSelf ();
return START_NOT_STICKY;
}
LogMessage ("SOLS after InitializeService: " + mShowOnLockScreen);
// If we get killed, after returning from here, restart
return START_STICKY;
}
int GetCurrentSecond ()
{
return Calendar.getInstance().get (Calendar.SECOND);
}
final static int Event1 = 0;
private static Handler mTimerHandler = null;
Handler NewTimerHandler ()
{
return new Handler (Looper.getMainLooper ())
{
@Override
public void handleMessage (@NonNull Message msg)
{
LogMessage ("SOLS at begin of handleMessage: " + mShowOnLockScreen);
try {
if (msg.what == Event1)
{
// trimitem noul mesj un pic dupa inceperea minutului urmator
int delay = 60 - GetCurrentSecond ();
if (delay < 10)
delay = 10; // lasam cel putin 10 secunde
sendMessageDelayed (obtainMessage (Event1),
delay * 1000); // la inc. min. urmator
//beep (200, 200, TONE_CDMA_ALERT_CALL_GUARD);
LogMessage ("SOLS before main action: " + mShowOnLockScreen);
if (IsSetShowOnLockScreen ())
// uneori vine mesaj de handler si dupa ce s-a dat comanda de
// auto-distrugere
beep (100, 200);
}
else
{
beep (200, 400);
}
}
catch (Exception e)
{
beep (200, 400);
}
}
};
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79654920/android-service-field-that-seems-to-be-modified-outside-of-code[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия