Spanish File.ReadString funciona a veces

manuel_g

Member
Licensed User
Hola buen día

Leyendo una tabla de MySql a través de InitializePost2,

B4X:
Sub Buscar_lista_de_paises
    
    Dim req As OkHttpRequest
    Dim Query As String
    Query="SELECT nombre, ID FROM paises ORDER BY ID"
    req.InitializePost2("http://192.168.0.14/paises.php", Query.GetBytes("UTF8"))
    hc.Execute(req, paises) '''''''' En ResponseSuccess hará el Case de paises
    
End Sub


en ResponseSuccess cuando leo el archivo con File.ReadString que generé con Response.GetAsynchronously,

B4X:
Sub hc_ResponseSuccess (Response As OkHttpResponse, tarea As Int)
    Dim res As String

    File.Delete(File.DirDefaultExternal,"respuesta.csv")
    Response.GetAsynchronously("Nombre_del_evento",File.OpenOutput(File.DirDefaultExternal,"respuesta.csv",True),True,1)   
    res=File.ReadString(File.DirDefaultExternal, "respuesta.csv")
    Log("Respuesta= :"&res)

End Sub

pues pasa algo muy curioso, y es que a veces la variable res que almacena la lectura de File.ReadString, está vacía y a veces no... Con la misma consulta a la base de datos, los mismos datos, todo exactamente igual, a veces File.ReadString devuelve el JSON de la consulta y a veces no devuelve nada...

El log a veces da: respuesta= [{"nombre":"Argentina","ID":"AR"},{"nombre":"Bolivia","ID":"BO"},{"nombre":"Colombia","ID":"CO"}]
El log a veces da: respuesta=

Alguna idea? Mil gracias
 

drgottjr

Expert
Licensed User
Longtime User
Response.GetAsynchronously implica un "event" (lo que tu has llamado "Nombre_del_evento"). pero en el codigo (al menos el que has mostrado), no hay referencia a el (el "event"). en lugar de decir "a veces ... esta vacia y a veces no", yo diria, "a veces ... esta vacia y a veces - por pura suerte - no". a mi parecer.

no olvides wait for (para consumir el "event") y, si no existe un motivo importante, mas vale utilizar okhttputils2 para esta operacion.
 

Jhonn

Member
Es porque lo estás llamando antes de que se complete el evento "nombre_del_evento" (yo lo cambie por FileResponse en el código) que es donde obtienes el resultado

B4X:
Sub hc_ResponseSuccess (Response As OkHttpResponse, tarea As Int)
  File.Delete(File.DirDefaultExternal,"respuesta.csv")
Response.GetAsynchronously("FileResponse",File.OpenOutput(File.DirDefaultExternal,"respuesta.csv",True),True,1)  
  
End Sub

Sub FileResponse_StreamFinish (Success As Boolean, TaskId As Int)
  If Success = False Then
    Log("error")
    Return
  End If
 
Dim res as String=File.ReadString(File.DirDefaultExternal, "respuesta.csv")
Log("Respuesta= :"&res)
End Sub
 
Top