Spanish [SOLUCIONADO] Sub en un Service

vbmundo

Well-Known Member
Licensed User
Hola

He añadido un Service a mi aplicación y además de variables he incorporado Subs

El problema es que desde las Activitys no logro ver esos SUBS.. es decir, coloco el nombre del Service y al pulsar "." (Punto) me aparecen solo las variables, pero ningún Sub.

Como es posible ?

Saludos
 

Descartex

Well-Known Member
Licensed User
Longtime User
Muy buenas.
Decláralo como Public.

B4X:
Public Sub MiSub

Un saludo.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Pues entonces no te queda otra q desplazarlos a un Code Module y llamarlos alli desde el Service y el Activity que quieras.
 

vbmundo

Well-Known Member
Licensed User
Pues entonces no te queda otra q desplazarlos a un Code Module y llamarlos alli desde el Service y el Activity que quieras.

es que DonManfred me esta diciendo que las rutinas para el manejo de su Lib de Base de Datos conviene que esten en un Service.. y ahora no puedo hacerlo ?
 

Descartex

Well-Known Member
Licensed User
Longtime User
Ni idea... yo suelo poner los Subs que necesito llamar desde mas de un Activity o Service en un Code Module... me es más claro a la hora de hacer debug.

Un saludo.
 

dar2o3

Active Member
Licensed User
Longtime User
Si se puede llamar a un sub en un servicio, hazlo público, la forma de hacerlo es:
CallSubDelayed(nombredelservicio, "nombresub")
CallSubDelayed2(nombredelservicio, "nombresub", parametro1)
CallSubDelayed3(nombredelservicio, "nombresub", parametro1, parametro2)
 
Last edited:

vbmundo

Well-Known Member
Licensed User
E estado leyendo el hilo en ingles donde planteas los errores que te salen, sin ver el código es dificil saber donde está el error, pero...

Donde declaras los parámetros de conexión?

DonManfred creo que se refiere a que los declares en un servicio starter:

https://www.b4x.com/android/forum/threads/starter-service-consistent-single-entry-point.57599/
Amigo

Tampoco funciona en el Starter, simplemente no logro ver los SUB hechos en un Servicio desde un Activity.. o no se hacerlo.

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo:

CallSubDelayed es una combinación de StartActivity, StartService y CallSub.
CallSub sólo funciona con los componentes que se están ejecutando.
CallSubDelayed primero inicia el componente y luego ejecuta el CallSub
En tu caso, como tu haces una llamada a un Servicio no funciona con solo un CallSub puesto que no lo inicias, y por eso si que te funciona el CallSubDelayed

Saludos
 

vbmundo

Well-Known Member
Licensed User
Hola Pablo:

CallSubDelayed es una combinación de StartActivity, StartService y CallSub.
CallSub sólo funciona con los componentes que se están ejecutando.
CallSubDelayed primero inicia el componente y luego ejecuta el CallSub
En tu caso, como tu haces una llamada a un Servicio no funciona con solo un CallSub puesto que no lo inicias, y por eso si que te funciona el CallSubDelayed

Saludos

Jesus, pero el CALLSUBDELAYED hace cualquier cosa... ya lo he probado... te doy un ejemplo

B4X:
Sub Prueba
      Codigo 1
      Codigo 2
      Codigo 3
     CallSubDelayed2("MiServicio","MiRutina",Parametro1)
     Codigo 4
     Codigo 5
End Sub

En el ejemplo que te he puesto... CallSubDelayed2 se ejecuta luego de Código 5, o a veces mucho despues... no tiene sentido ni lógica..

Han hecho un universo de lo Asincrónico y es un gran error... como programador de mas de 25 años que soy te digo, que los resultados de lo Asincronico son muy dificiles de preveer.

Yo necesito que luego de Código 3 se ejecute una rutina del Servicio, y que cuando la misma termine, devuelva el control a Codigo 4

DonMamfred
me ha recomendado que todo el código de la lectura, conexión y resultados de su Lib de MySQL lo vuelque a un Servicio.. hasta ahora lo tenia en cada Activity y al menos funciona sin problemas... pero el me dice que una buena Práctica es tener ese código en un Servicio y luego interactuar entre el Activity y el Servicio con el CallSubDelayed

No me sirve !!

Hace cualquier cosa... al punto tal.. que tengo 2 CallSubDelayed... uno conecta la BD y otro hace un Query... corriendo con el depurador veo que a veces , cambia el orden de los Calls y termina ejecutando el Query antes que la conexión.

Que me aconsejas ?

Quiero llevar a cabo la mejor Práctica pero esto es una locura.

Saludos y Gracias
 

dar2o3

Active Member
Licensed User
Longtime User
A ver, una posible solución a tu problema (sin saber lo que haces en el servicio y sin conocer esa librería en concreto) podría ser dividir el código
B4X:
Sub Prueba
Codigo 1
Codigo 2
Codigo 3
CallSubDelayed2("MiServicio","MiRutina",Parametro1)
End Sub

sub seguimos
'desde el servicio llamas a este sub cuando obtengas los datos (o loque sea que hagas)
codigo4
Codigo 5
end sub

De todas maneras para hacer un simple select como tu dices algo tienes mal planteado.

Si el servicio solo lo usas para lanzar la consulta sql y parametrizar, yo no lo usaría, un servicio no está pensado para eso, e estado mirando los ejemplos del propio DonManfred y el usa el activity para inicializar y todo lo demás.
Otro tema sería que quieras lanzar consultas desde distintos activitys y por ahorrar código quieras crearte un servicio para ello (viendo los ejemplos de la librería parece que no funciona en un code módule), yo personalmente no usaría un servicio para esto.
 
Last edited:

vbmundo

Well-Known Member
Licensed User
De todas maneras para hacer un simple select como tu dices algo tienes mal planteado.

Si el servicio solo lo usas para lanzar la consulta sql y parametrizar, yo no lo usaría, un servicio no está pensado para eso, e estado mirando los ejemplos del propio DonManfred y el usa el activity para inicializar y todo.

Si, pero es él quien me dice que vuelque todo a un Service... y luego no sabe como resolverlo.

Muchas cosas , ha tenido que intervenir el usuario Keirs para aclarar cosas que Manfred no sabe. lo paradójico es que Keirs te da la Lib gratuitamente y Manfred te cobra (que me parece correcto que cobre) pero luego no te sabe dar respuesta a cosas tan lógicas que te desconcierta.

Concretamente...

Si tu haces un Lib para conectar tu APP a MySQL y realizar consultas, como es que no sabes que el manejo de Fechas de MySQL a veces tiene incompatibilidades con como Java maneja los Tipos de Datos.. concretamente es muy normal que campos DATE, tenga como valor DEFAULT "0000-00-00" para fechas... pero JAVA no las reconoce.. las trata como fechas inválidas.

Para resolver esto , la conexión debe contener un texto extra que indica que las fechas inválidas (rellenas con 0) sean convertidas en NULL

KEIRs me dio la ayuda, pero DonManfred se quedó con el NO SE PUEDE y listo.

Por eso me desconcierta y me ha hecho perder un tiempo enorme.

Saludos
 

dar2o3

Active Member
Licensed User
Longtime User
El señor DonManfred por mi parte es digno de alabanza, controla muchísimo de muchas cosas (es imposible saberlo todo sobre todo) a creado un montón de librerías gratuitas las cuales mantiene por amor al arte, yo uso algunas de las librerías que el a creado sin problema.

Por otra parte cuando se envuelve una librería para b4a, expones los métodos y propiedades de la librería original para poder ser usada desde b4x, en teoría creo que podrías envolver una librería (creada en java por alguien) para b4a sin saber siquiera que es lo que hace.
 

vbmundo

Well-Known Member
Licensed User
El señor DonManfred por mi parte es digno de alabanza, controla muchísimo de muchas cosas (es imposible saberlo todo sobre todo) a creado un montón de librerías gratuitas las cuales mantiene por amor al arte, yo uso algunas de las librerías que el a creado sin problema.

Por otra parte cuando se envuelve una librería para b4a, expones los métodos y propiedades de la librería original para poder ser usada desde b4x, en teoría creo que podrías envolver una librería (creada en java por alguien) para b4a sin saber siquiera que es lo que hace.

Yo mismo le he alabado publicamente y en privado.. no es que tengo mayores quejas de el... pero en este ultimo caso me ha desorientado.

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo

Aunque algo tarde...
Debes de tener en cuenta que un CallSubDelayed como su propio nombre indica es retrasado en la ejecucion, por lo que te explique de como funciona. Asi que hacer esta secuencia:
Sub Prueba
Codigo 1
Codigo 2
Codigo 3
CallSubDelayed2("MiServicio","MiRutina",Parametro1)
Codigo 4
Codigo 5
End Sub

Es lógico que se te ejecute Codigo 5 o cualquier otro y no entre en tu rutina, tu bien lo has dicho, es un sistema asincrono, y por lo tanto asi debes tratarlo. Con tu experiencia de programación poco puedo añadir que no hayas intentado, pero dos soluciones fáciles es crear una variable global, que cuando vaya entrando en tus rutinas le pongas un valor, y el resto de llamadas que no se hagan hasta que no se cumpla estos valores. Tambien puedes generar un evento en el activity para decirle que tu rutina se cumplió.

Saludos
 
Top