Spanish [SOLUCIONADO]¿Como hacer que se ejecute primero un JobDone B4A?

ferpahud

Active Member
Licensed User
Hola buenos días,

Según entiendo el funcionamiento de los JobDone, es que estos se ejecutan de forma automática sin ser llamados.

En mi caso puntal estoy haciendo una aplicación, la cual tiene una base de datos interna, que al abrir la app es "pisada" por una base online que tiene la misma estructura, pero distintos datos.

Es decir que con un HttpJob, obtengo los datos de la base online, borro los datos de la interna e ingreso los datos de la base descargada, esto es para mantener la base actualizada, y si el usuario no tiene conexión a internet (lo que impedirá ejecutar el HttpJob) por lo menos muestre los datos de la ultima base de datos descargada.

No busco y muestro los datos de la base online directamente porque si el usuario no tiene conexión la aplicación no muestra ninguna información, es por eso que prefiero siempre descargar la base y pisar la existente en caso q tenga conexión, y sino mostrar la ultima descargada.

El problema que tengo, es que necesito que el JobDone se ejecute primero , sino la aplicación empieza a recorrer los datos de la base interna antes de borrarla, lo que no hace que no se muestren los datos actualizados.

B4X:
Sub GetData(SQL_Cadena As String, sJob As String)
    Dim GetSQL As HttpJob
    GetSQL.Initialize(sJob, Me)
    GetSQL.download2("http://web.com/conexion.php", Array As String ("SQL", SQL_Cadena))
End Sub

Sub actualizarRubros
    GetData("SELECT * FROM rubros" ,"GetRubros")
End Sub


Sub JobDone(Job As HttpJob)
    If Job.Success Then
            Dim res As String
            res = Job.GetString
    If res.StartsWith("{") Or res.StartsWith("[") Then
       
            Log("Back from Job:" & Job.JobName )
            Log("Job Text: " & res)
            Dim parser As JSONParser
            parser.Initialize(res)

        Select Job.JobName
       
            Case "GetRubros"
               Dim ListaDatos As List
                 ListaDatos = parser.NextArray 'returns a list with maps
                If ListaDatos.Size == 0 Then
                   'Algun mensaje.
                Else
                  s.BeginTransaction
                  s.ExecNonQuery("DELETE FROM rubros")
                  For i = 0 To ListaDatos.Size - 1
                       Dim Datos As Map
                       Datos = ListaDatos.Get(i)
                       s.ExecNonQuery2("INSERT INTO rubros VALUES(?,?,?,?)", Array As String(Datos.Get("id_rubro"), Datos.Get("rubro"), Datos.Get("imagen"), Datos.Get("orden_de_listado")))
                  Next
                          ToastMessageShow("Datos actualizados", False)
                          s.TransactionSuccessful
                          s.EndTransaction
                End If
        End Select
    Else
    'alguna condicion
    End If
    Else
        ToastMessageShow("Datos no actualizados - Sin conexión", False)
    End If
    Job.Release

End Sub

¿Alguien sabe como hacerlo? Desde ya muchas gracias por su tiempo
 

rscheel

Well-Known Member
Licensed User
Longtime User
Primero necesitas comprobar la conexión a Internet, y si tienes conexión a Internet llamas actualizarRubros, en el caso de que no tengas conexión a Internet llamas sub llamado por ejemplo DatosLocales, este obtendrá los datos de la bd local lo que serán mostrados, en el caso de que tuvieras conexión actualizarRubros como dije antes una ves que realice la actualización de los datos en tu bd local llamas el Sub DatosLocales el cual se encargara de mostrar los datos ya actualizados por ejemplo.

Si entro al JobDone

B4X:
Sub JobDone(Job As HttpJob)
    If Job.Success Then
            Dim res As String
            res = Job.GetString
    If res.StartsWith("{") Or res.StartsWith("[") Then
      
            Log("Back from Job:" & Job.JobName )
            Log("Job Text: " & res)
            Dim parser As JSONParser
            parser.Initialize(res)

        Select Job.JobName
      
            Case "GetRubros"
               Dim ListaDatos As List
                 ListaDatos = parser.NextArray 'returns a list with maps
                If ListaDatos.Size == 0 Then
                   'Algun mensaje.
                Else
                  s.BeginTransaction
                  s.ExecNonQuery("DELETE FROM rubros")
                  For i = 0 To ListaDatos.Size - 1
                       Dim Datos As Map
                       Datos = ListaDatos.Get(i)
                       s.ExecNonQuery2("INSERT INTO rubros VALUES(?,?,?,?)", Array As String(Datos.Get("id_rubro"), Datos.Get("rubro"), Datos.Get("imagen"), Datos.Get("orden_de_listado")))
                  Next
                          ToastMessageShow("Datos actualizados", False)
                          s.TransactionSuccessful
                          s.EndTransaction
                          DatosLocales 'agregas aquí la carga de los datos locales, luego de haber actualizado los datos.
                End If
        End Select
    Else
    'alguna condicion
    End If
    Else
        ToastMessageShow("Datos no actualizados - Sin conexión", False)
    End If
    Job.Release

End Sub
 

ferpahud

Active Member
Licensed User
Primero necesitas comprobar la conexión a Internet, y si tienes conexión a Internet llamas actualizarRubros, en el caso de que no tengas conexión a Internet llamas sub llamado por ejemplo DatosLocales, este obtendrá los datos de la bd local lo que serán mostrados, en el caso de que tuvieras conexión actualizarRubros como dije antes una ves que realice la actualización de los datos en tu bd local llamas el Sub DatosLocales el cual se encargara de mostrar los datos ya actualizados por ejemplo.

Si entro al JobDone

B4X:
Sub JobDone(Job As HttpJob)
    If Job.Success Then
            Dim res As String
            res = Job.GetString
    If res.StartsWith("{") Or res.StartsWith("[") Then
     
            Log("Back from Job:" & Job.JobName )
            Log("Job Text: " & res)
            Dim parser As JSONParser
            parser.Initialize(res)

        Select Job.JobName
     
            Case "GetRubros"
               Dim ListaDatos As List
                 ListaDatos = parser.NextArray 'returns a list with maps
                If ListaDatos.Size == 0 Then
                   'Algun mensaje.
                Else
                  s.BeginTransaction
                  s.ExecNonQuery("DELETE FROM rubros")
                  For i = 0 To ListaDatos.Size - 1
                       Dim Datos As Map
                       Datos = ListaDatos.Get(i)
                       s.ExecNonQuery2("INSERT INTO rubros VALUES(?,?,?,?)", Array As String(Datos.Get("id_rubro"), Datos.Get("rubro"), Datos.Get("imagen"), Datos.Get("orden_de_listado")))
                  Next
                          ToastMessageShow("Datos actualizados", False)
                          s.TransactionSuccessful
                          s.EndTransaction
                          DatosLocales 'agregas aquí la carga de los datos locales, luego de haber actualizado los datos.
                End If
        End Select
    Else
    'alguna condicion
    End If
    Else
        ToastMessageShow("Datos no actualizados - Sin conexión", False)
    End If
    Job.Release

End Sub

Eso intentaba hacer, pero no me funcionaba, puede darme cuenta que el error estaba en otro lado. Luego de resolver el error hice lo que indica y ahora funciona correctamente, solo me queda pendiente saber como comprobar si el dispositivo tiene conexión a internet.

Gracias por la ayuda, saludos!
 

rscheel

Well-Known Member
Licensed User
Longtime User
Eso intentaba hacer, pero no me funcionaba, puede darme cuenta que el error estaba en otro lado. Luego de resolver el error hice lo que indica y ahora funciona correctamente, solo me queda pendiente saber como comprobar si el dispositivo tiene conexión a internet.

Gracias por la ayuda, saludos!

Para comprobar conexión a Internet es bastante sencillo

B4X:
Sub isConnected() As Boolean
Dim sSocket As ServerSocket
If  sSocket.IsInitialized = False Then
    sSocket.Initialize(8080, "sSocket")
    sSocket.Close
End If
Dim res As String
res = sSocket.GetMyIP
Log(res)
If sSocket.GetMyIP = "127.0.0.1" Or res.StartsWith("fe80::") Then 'fe80::94c2:c6ff:fe42:b881%dummy0
    Return False
Else
       Return True
End If
End Sub

B4X:
If isConnected Then
    'Con conexión
Else
     'Sin conexión
End If

Debes usar la Liberia Network
 

ferpahud

Active Member
Licensed User
Para comprobar conexión a Internet es bastante sencillo

B4X:
Sub isConnected() As Boolean
Dim sSocket As ServerSocket
If  sSocket.IsInitialized = False Then
    sSocket.Initialize(8080, "sSocket")
    sSocket.Close
End If
Dim res As String
res = sSocket.GetMyIP
Log(res)
If sSocket.GetMyIP = "127.0.0.1" Or res.StartsWith("fe80::") Then 'fe80::94c2:c6ff:fe42:b881%dummy0
    Return False
Else
       Return True
End If
End Sub

B4X:
If isConnected Then
    'Con conexión
Else
     'Sin conexión
End If

Debes usar la Liberia Network
Perfecto! muchisimas gracias!
 
Top