Hola
amigo gracias por tu ayuda, te comento que el error de bluetooth y de mac son por que no esta conectado al aparato con el que se comunica
Si, pero al igual que yo que ni tenia el bluetooth en marcha
, le podrá pasar a a tu usuario, asi que tendrias que preveer ese error y evitarlo. Yo no se que hace tu programa, solo sabia segun tu que se te paraba, asi que lo unico que hice fue ponerlo en marcha y esperar a que se parara para ver cual era el problema.
como puedo saber cual es el objeto que no se a inicializado?
Según ese error parece ser el SQL:
Caused by: java.lang.RuntimeException: Object should first be initialized.
at anywheresoftware.b4a.sql.SQL.checkNull(SQL.java:48)
at anywheresoftware.b4a.sql.SQL.ExecQuery(SQL.java:154)
Ya se que tu en el Main lo inicializas, pero podria ser que al entrar en el servicio (en mi prueba), main no estuviese en segundo plano, si no que la hubiese borrado, y entonces se encontrara que no estaba reiniciado.
Lo mejor en estos casos es que en el servicio, en vez de hacer referencia a main para consultar cosas del SQL, lo hagas directamente con variables locales del servicio, haces igual que en Main que compruebas si está inicializado, y a partir de ahi haces las consultas pertinentes.
Por otro lado, aunque no tenga que ver con tu pregunta original, te comento varias cosas que no deberias hacer en tu codigo, y que posiblemente eso sea la causa de no funcionar correctamente.
1)
Los temporizadores en un servicio es malo ponerlos (otros te diran que prohibitivos), y lo mas seguro es que al final fallen, normalmente Android puede matar ese servicio y al cabo del tiempo lo volverá a poner en marcha, por lo tanto tus temporizadores no funcionaran. Y mas cuando has puesto este código:
#Region Service Attributes
#StartCommandReturnValue: android.app.Service.START_STICKY
Android en un momento dado puede que pare el servicio y lo vuelva a iniciar al cabo de unos segundos, ese codigo se pone para eso, para que en caso de que Android o el usuario al borrar los procesos de fondo o la memoria si el servicio se para, vuelva a ponerse en marcha.
Así que como ves tus temporizadores al final acabaran por fallar. Por otro lado, una de las finalidades del servicio es esa, actuar como temporizador al volver a llamar al servicio en
StartServiceAt, por lo que tu debes programar tus tareas ahí. Y puedes hacer varias cosas, o creas variables generales y las emplea como contadores y cuando lleguen al tiempo que tu creas oportuno haces la tarea, o bien creas un servicio por cada temporizador y lo llamas en el tiempo que tu creas.
Con esto, te aseguras que aunque Android mate el servicio, al volver a crearlo se hará la tarea que tu has programado en
StartServiceAt. Esto no ocurrirá con el temporizador.
2)
El
Sub Service_Create no funciona igual que el
Sub Activity_Create(FirstTime As Boolean), el
Sub Service_Create entra solo cuando se crea el servicio, no cada vez que entra en el servicio, la condicion de entrar cada vez en el servicio se cumplirá en el
Sub Service_Start (StartingIntent As Intent) y en tu ejemplo cada 5 segundos por haber puesto este codigo:
Sub Service_Start (StartingIntent As Intent)
StartServiceAt("", DateTime.Now + 5 * DateTime.TicksPerSecond, True)
End Sub
Por lo tanto, y basandonos en el punto 1) , cuando Android mate el servicio, los temporizadores dejan de funcionar, y solo cuando lo vuelva a crear los volverá a poner en marcha, pero empezando de cero.
Resumiendo:
- Pasa tu codigo a
Sub Service_Start (StartingIntent As Intent)
- En el
Sub Service_Create inicializa las variables u objetos que necesites, pero no hagas llamadas a tareas, eso hazlo en
Sub Service_Start (StartingIntent As Intent)
- Quita los temporizadores (al menos yo lo haria) y haz las tareas de estos en
Sub Service_Start (StartingIntent As Intent) y si necesitas varios tiempos create variables globales o servicios independientes.
También ten en cuenta que para la mayoría de aplicaciones 5 segundos es un período muy corto, ya que puedes agotar la batería del dispositivo si esto se mantiene eternamente en el tiempo, asi que intenta ajustar mas los tiempos a la necesidad que tengas y con eso harás que tu aplicacion no consuma mucha bateria.
Ya se que me dijiste que no dominas el ingles (como la mayoria que estamos en este foro
) pero seria muy interesante que leyeras el tutorial de Erel sobre los Servicios:
http://www.b4x.com/android/forum/threads/service-modules.7542/#content
Siempre es mejor emplear el Traductor de Google que no leer nada, algo entenderas con esa traducción. Por mi parte cuando tengo un rato intento hacer algun tutorial en español de temas de mucho uso, y como abras visto otros tambien lo hacen. Pero como yo, nos debemos a nuestro trabajo diario, y hacer eso o responder en el foro es una actividad extra no renumerada, y por eso yo pongo incapie en que antes de empezar a preguntar leamos, y probemos ejemplos, y cuando lleguemos al punto que ya no podemos avanzar, entonces preguntar en el foro, al menos es lo que yo hago.
Feliz fin de semana
Saludos