Spanish Problema para generar widget invocando la temperatura

Rene Barrera

Member
Licensed User
Longtime User
Hola, antes que nada quiero decir que cree una aplicación usando un web service de temperatura y me funcionó PERFECTO.
El punto es que cuando trato de implementar este mismo código para construir un widget ya no funciona, solo recibo un mensaje que dice que se detuvo el widget. Anexo el código porque no sé porqué mis aplicaciones las guarda de manera muy pesada (más de 512k) y no me permite subir el archivo.
Presento el código que mencioné y reitero que éste funcionó correctamente. Aparte anexo también una imagen del layout usado.
Es importante mencionar que ya he solicitado apoyo al foro en inglés y amablemente me contestan, sin embargo, las respuestas son como que más bien tips, pero no sirven de mucho, también les comento que cuando quede resuelto subiré las solución para que esté al alcance de toda la comunidad.
Si mi explicación no ha sido clara o falta más información, por favor déjenme saber.
Anexo también las imágenes usadas en la aplicación.
Gracias anticipadas.

B4X:
#Region  Project Attributes
    #ApplicationLabel: TIM_Clima
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
  
    Dim HttpClient1 As HttpClient
End Sub

Sub Globals
  
    Dim URL As String
  Dim XML As String
    Dim Ciudad As String : Ciudad = "acapulco"
    Dim Pais As String   : Pais = "Mexico"
    '''''''''''''''''''''''''''''''''''''''''''''
    Dim lblTemperature As Label
    Dim lblLocation As Label
    Dim lblVisibility As Label
    Dim lblSkyConditions As Label
    Dim lblRelativeHumidity As Label
    Dim imgWeather As ImageView
    '''''''''''''''''''''''''''''''''''''''''''''
    Dim intFin As Int                                        'Indice del fin de búsqueda del string correspondiente
    Dim strResult As String                       'Trae inf del Resultado para validar si se tiene información
  
End Sub

Sub Activity_Create(FirstTime As Boolean)

     Activity.LoadLayout("lyoWeather")
  
   If FirstTime Then
     HttpClient1.Initialize ("HttpClient1")
   End If
   ConsumirServicio
   
End Sub

Sub ConsumirServicio()
     
    Dim Request As HttpRequest
      
    URL = "http://www.webservicex.net/globalweather.asmx"
  
    XML = XML & "<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:web='http://www.webserviceX.NET'>"
    XML = XML & "<soap:Header/>"
    XML = XML & "<soap:Body>"
    XML = XML & "<web:GetWeather>"
    XML = XML & "<web:CityName>" & Ciudad & "</web:CityName>"
    XML = XML & "<web:CountryName>" & Pais & "</web:CountryName>"
    XML = XML & "</web:GetWeather>"
    XML = XML & "</soap:Body>"
    XML = XML & "</soap:Envelope>"
              
  Request.InitializePost2(URL, XML.GetBytes("UTF8"))
  Request.SetHeader("Content-Type", "application/soap+xml; charset=utf-8")                                                                  
  Request.Timeout = 600000 'Setea el tiempo a 60 segundos
  If HttpClient1.Execute(Request, 1) = False Then Return
     
    ProgressDialogShow("Esperando Respuesta...")
   
End Sub

Sub HttpClient1_ResponseSuccess (Response As HttpResponse, TaskId As Int)
 
    ProgressDialogHide
  
  Dim resultSoapXML As String
  
  resultSoapXML = Response.GetString("UTF8")
    GetInfo(resultSoapXML)

End Sub

Sub GetInfo(ResultSoapXML As String)

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''INI - substrings para ir obteniendo la Información del Web Service del Clima'''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    'Valida si se tiene información para la localidad seleccionada
    strResult = ResultSoapXML.SubString(ResultSoapXML.IndexOf("<GetWeatherResult>")+ 18)
    intFin = strResult.IndexOf("</GetWeatherResult>")
    strResult = strResult.subString2(0, intFin)
  
    If strResult = "Data Not Found" Then
        ToastMessageShow ("No se tiene Información de Temperatura para " & Ciudad & "!", True)
        Activity.Finish   
    End If

    Set_Location(ResultSoapXML)               'Localidad
    Set_Temperature(ResultSoapXML)        'Temperatura
    Set_Visibility(ResultSoapXML)              'Visibilidad
    Set_SkyConditions(ResultSoapXML)      'Condiciones Climáticas
    Set_RelativeHumidity(ResultSoapXML)   'Humedad relativa

'''    'Hora
'''    strTime = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;Time&gt;")+ 12)
'''    intFin = strTime.IndexOf("&lt;/Time&gt;")
'''    strTime = strTime.subString2(0, intFin)
'''  
'''    'Wind (Viento)
'''    strWind = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;Wind&gt;")+ 12)
'''    intFin = strWind.IndexOf("&lt;/Wind&gt;")
'''    strWind = strWind.subString2(0, intFin)
'''      
'''    'DewPoint (Humedad)
'''    strDewPoint = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;DewPoint&gt;")+ 16)
'''    intFin = strDewPoint.IndexOf("&lt;/DewPoint&gt;")
'''    strDewPoint = strDewPoint.subString2(0, intFin)
'''
'''    'Pressure (presión Atmosférica)
'''    strPressure = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;Pressure&gt;")+ 16)
'''    intFin = strPressure.IndexOf("&lt;/Pressure&gt;")
'''    strPressure = strPressure.subString2(0, intFin)

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''FIN - substrings para ir obteniendo la Información del Web Service del Clima'''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End Sub

Sub Set_Temperature(Temperatura As String)   'Temperatura

    Temperatura = Temperatura.subString2(Temperatura.IndexOf("&lt;Temperature&gt;")+ 19, Temperatura.IndexOf("&lt;/Temperature&gt;") )
    Temperatura = Temperatura.subString2(Temperatura.IndexOf("(")+ 1, Temperatura.IndexOf("C)") )
    Temperatura = Temperatura & " " &  "°C"
    lblTemperature.Text = Temperatura
  
End Sub

Sub Set_Location(Location As String)   'Localidad

    Location = Location.SubString2(Location.IndexOf("&lt;Location&gt;")+ 16, Location.IndexOf(Pais))
    lblLocation.Text = Location & " " & Pais
  
End Sub

Sub Set_SkyConditions(SkyConditions As String)   'Condiciones Climáticas

    SkyConditions = SkyConditions.SubString2(SkyConditions.IndexOf("&lt;SkyConditions&gt;")+ 21, SkyConditions.IndexOf("&lt;/SkyConditions&gt;"))
      
    Select SkyConditions.Trim
      
        Case "partly cloudy"
            SkyConditions = "Parcialmente Nublado"  
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "002PartlyCloudy.png")
        Case "mostly cloudy"
            SkyConditions = "Mayormente Nublado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "003MostlyCloudy.png")
        Case "overcast"
            SkyConditions = "Completamente Nublado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "004Overcast.png")
        Case "mostly clear"
            SkyConditions = "Cielo mayormente despejado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "001Clear.png")
        Case "sunny"
            SkyConditions = "Soleado"  
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "006Sunny.png")
        Case "obscured"
            SkyConditions = "Cielo completamente cubierto de cubes"  
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "005Obcured.png")
        Case  "clear"
            SkyConditions = "Despejado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "001Clear.png")
        Case Else
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "000Weather.png")
              
    End Select

    lblSkyConditions.Text = "Condición Climática: " & SkyConditions
      
End Sub

Sub Set_Visibility(Visibility As String)   'Visibilidad

    Dim dblCantidad As Float         'Cantidad
    Dim strCnvrtMiles_Km As String      'Convierte de Millas a Kilómetros

    dblCantidad = Visibility.SubString2(Visibility.IndexOf("&lt;Visibility&gt;")+ 18, Visibility.IndexOf("mile"))
    Visibility = Visibility.SubString(Visibility.IndexOf("&lt;Visibility&gt;")+ 18)
    Visibility = Visibility.SubString2(Visibility.IndexOf(":"), Visibility.IndexOf("&lt;/Visibility&gt;"))
    strCnvrtMiles_Km = 1.6093470879 * dblCantidad 'Una Milla equivale a 1.6093470879 Km
    strCnvrtMiles_Km = NumberFormat(strCnvrtMiles_Km, 1, 2)
    lblVisibility.Text = "Visibilidad: " & strCnvrtMiles_Km & " Km " & Visibility
  
End Sub

Sub Set_RelativeHumidity(RelativeHumidity As String)   'Temperature (Temperatura)

    RelativeHumidity = RelativeHumidity.SubString2(RelativeHumidity.IndexOf("&lt;RelativeHumidity&gt;")+ 24, RelativeHumidity.IndexOf("&lt;/RelativeHumidity&gt;"))
    lblRelativeHumidity.Text = "Humedad Relativa:  " & RelativeHumidity
  
End Sub

Sub HttpClient1_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)  

    ProgressDialogHide
  Dim resultSoapXML As String
  
  resultSoapXML = Response.GetString("UTF8")

    Msgbox(resultSoapXML,"")

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
 

Attachments

  • lyoWeather.png
    lyoWeather.png
    32.1 KB · Views: 312
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Rene

No dispongo ahora de mucho tiempo como para revisar todo el código, por otro lado no has puesto la parte de código que interesa que es la del Widget, aunque la he mirado en la que has puesto en el foro inglés ;) .

Asi a simple vista, quita los MsgBox y los ProgressDialogShow, los MsgBox detienen la ejecucion del programa y eso en un servicio no se puede hacer, y es eso lo que hace que se detenga la aplicación.
Si Sigues teniendo problemas, pon Logs en cada sitio que tengas dudas tanto en la linea anterior como la posterior, de esta forma sabras si se ha ejecutado el código (por ejemplo si llamas a un sub)

Si aun así se sigue parando, yo haria una cosa. Crea un nuevo proyecto, el codigo que lee la temperatura crealo en un servicio normal y llámalo cada pocos minutos (asi sabras si funciona), crea las variables globales que te interesen leer, en este caso la temperatura, localización, etc, crea un Timer en el Main, y alli simplemente escribes en el log las variables globales, de esta forma veras si el codigo funciona en un servicio y tambien no tendras que crear objetos en el Main para saber los valores.
Con esto podras saber donde está fallando la aplicación, aunque tiene todos los números de ser los MsgBox y los ProgressDialogShow.

Luego seria tan facil de mantener ese nuevo servicio y llamarlo desde el Sub rv_RequestUpdate con un StartService(ServicioLeerTemperatura)

Saludos
 
Last edited:

Rene Barrera

Member
Licensed User
Longtime User
Hola Rene

No dispongo ahora de mucho tiempo como para revisar todo el código, por otro lado no has puesto la parte de código que interesa que es la del Widget, aunque la he mirado en la que has puesto en el foro inglés ;) .

Asi a simple vista, quita los MsgBox y los ProgressDialogShow, los MsgBox detienen la ejecucion del programa y eso en un servicio no se puede hacer, y es eso lo que hace que se detenga la aplicación.
Si Sigues teniendo problemas, pon Logs en cada sitio que tengas dudas tanto en la linea anterior como la posterior, de esta forma sabras si se ha ejecutado el código (por ejemplo si llamas a un sub)

Si aun así se sigue parando, yo haria una cosa. Crea un nuevo proyecto, el codigo que lee la temperatura crealo en un servicio normal y llámalo cada pocos minutos (asi sabras si funciona), crea las variables globales que te interesen leer, en este caso la temperatura, localización, etc, crea un Timer en el Main, y alli simplemente escribes en el log las variables globales, de esta forma veras si el codigo funciona en un servicio y tambien no tendras que crear objetos en el Main para saber los valores.
Con esto podras saber donde está fallando la aplicación, aunque tiene todos los números de ser los MsgBox y los ProgressDialogShow.

Luego seria tan facil de mantener ese nuevo servicio y llamarlo desde el Sub rv_RequestUpdate con un StartService(ServicioLeerTemperatura)

Saludos
Hola Jesús, muchas gracias por responder, seguiré los pasos que indicas y te dejaré saber el resultado. Por cierto, el código que ves es el mismo que está en el widget.
Muchas gracias
 

Rene Barrera

Member
Licensed User
Longtime User
Hola Jesús, muchas gracias por responder, seguiré los pasos que indicas y te dejaré saber el resultado. Por cierto, el código que ves es el mismo que está en el widget.
Muchas gracias

Hola Jesús,

Sé que estas muy ocupado, pero me atrevo a distraerte nuevamente para mandarte el código del widget, éste código está en un Service Module que nombré "srvClima", y para éste ejemplo también tengo un layout llamado "lyoWeather" que solo tiene un Panel y una etiqueta. Subo el código del Main y del Módulo de Servicio (srvClima) que es donde estoy tratando de crear el Widget, también subo una imagen del layout mencionado. Espero te sea posible crear un pequeño proyecto y tratar de ejecutar el widget para que con tu experiencia detectes cual es el problema y me puedas apoyar para resolver mi caso. Debo comentar que corre hasta la línea de código:
rv.SetText("lblTemperature", "Esperando Respuesta...")
de aquí no pasa.

Muchísimas gracias

CODIGO del Main:

B4X:
#Region Module Attributes
    #FullScreen: False
    #IncludeTitle: True
    #ApplicationLabel: ABG Clima Widget
    #VersionCode: 1
    #VersionName:
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

'Activity module
Sub Process_Globals
End Sub

Sub Globals
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Msgbox("Vaya a Pantalla de Inicio y active Widget: ABG-TIM-Clima", "")
    Activity.Finish
End Sub

Sub Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
End Sub

CODIGO del Módulo de Servicio "srvClima" (Código donde estoy tratando de crear el Widget):

B4X:
#Region  Service Attributes
    'Para que iniciar el Servicio cuando se reinicie el dispositivo
    #StartAtBoot: False
    'para que Android no mate el Servicio
    #StartCommandReturnValue: android.app.Service.START_STICKY
#End Region

'Service module
Sub Process_Globals
  
    Dim rv As RemoteViews
    Dim HttpCli1 As HttpClient
    Dim URL As String
  Dim XML As String
    Dim Ciudad As String : Ciudad = "Acapulco"
    Dim Pais As String   : Pais = "Mexico"
  
End Sub
Sub Service_Create

    'Set the widget to update every 60 minutes.
    rv = ConfigureHomeWidget("lyoWeather", "rv", 30, "ABG-TIM-Clima")
    HttpCli1.Initialize ("HttpCli1")
  
End Sub

Sub Service_Start (StartingIntent As Intent)

    If rv.HandleWidgetEvents(StartingIntent) Then Return

'    rv.SetText("lblTemperature", "SI LLEGO AL SERVICE_START")
  
End Sub

Sub rv_RequestUpdate

    ConsumirWebService
    rv.UpdateWidget

End Sub

Sub ConsumirWebService()

    Dim Request As HttpRequest
      
    URL = "http://www.webservicex.net/globalweather.asmx"
  
    XML = XML & "<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:web='http://www.webserviceX.NET'>"
    XML = XML & "<soap:Header/>"
    XML = XML & "<soap:Body>"
    XML = XML & "<web:GetWeather>"
    XML = XML & "<web:CityName>" & Ciudad & "</web:CityName>"
    XML = XML & "<web:CountryName>" & Pais & "</web:CountryName>"
    XML = XML & "</web:GetWeather>"
    XML = XML & "</soap:Body>"
    XML = XML & "</soap:Envelope>"
          
  Request.InitializePost2(URL, XML.GetBytes("UTF8"))
  Request.SetHeader("Content-Type", "application/soap+xml; charset=utf-8")                                                                  
  Request.Timeout = 6000000
      
    Try
         If HttpCli1.Execute(Request, 0) = False Then Return
        rv.SetText("lblTemperature", "Esperando Respuesta...")              
      
    Catch
        rv.SetText("lblTemperature", LastException)  
    End Try
       
End Sub

Sub HttpCli1_ResponseSuccess (Response As HttpResponse, TaskId As Int)
  
  Dim resultSoapXML As String
  
  resultSoapXML = Response.GetString("UTF8")
    rv.SetText("lblTemperature", resultSoapXML)
    GetInfo(resultSoapXML)

End Sub

Sub HttpCli1_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)  

  Dim resultSoapXML As String
  
  ToastMessageShow (Response & " / ERROR ABG", True)
  
End Sub

Sub GetInfo(ResultSoapXML As String)

    Dim intFin As Int                                        'Indice del fin de búsqueda del string correspondiente
    Dim strResult As String                       'Trae inf del Resultado para validar si se tiene información
    Dim strTemperature As String               'Trae la temperatura
      
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''INI - substrinas para ir obteniendo la Información del Web Service del Clima'''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    'Valida si se tiene información para la localidad seleccionada
    strResult = ResultSoapXML.SubString(ResultSoapXML.IndexOf("<GetWeatherResult>")+ 18)
    intFin = strResult.IndexOf("</GetWeatherResult>")
    strResult = strResult.subString2(0, intFin)
  
    If strResult = "Data Not Found" Then
        ToastMessageShow ("No se tiene Información de Temperatura para " & Ciudad & "!", True)
        rv_Disabled
    End If

    'Temperature (Temperatura)
    strTemperature = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;Temperature&gt;")+ 19)
    intFin = strTemperature.IndexOf("&lt;/Temperature&gt;")
    strTemperature = strTemperature.subString2(0, intFin)
    rv.SetText("lblTemperature", strTemperature)
      
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''FIN - substrings para ir obteniendo la Información del Web Service del Clima'''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

End Sub

Sub HttpClient1_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)  

  Dim resultSoapXML As String
  
  resultSoapXML = Response.GetString("UTF8")
    ToastMessageShow ("ERROR", True)

End Sub

Sub rv_Disabled
    StopService("")
End Sub

Sub Service_Destroy
End Sub

IMAGEN del layout usado (lyoWeather):
 

Attachments

  • lyoWeather.png
    lyoWeather.png
    25.5 KB · Views: 298
Last edited:
Top