PDA

Ver la Versión Completa : Json nulo con REST y android


NicolasP
29-11-2016, 21:53:59
Hola:
Recupero los datos de un cliente pasando su ID como parámetro en una cunsulta que esta en una página en php.
Los recibo en JSON por medio de RESTResponse. , todo bien cuando viene algo.
Cuando la consulta da vacía ... en el servidor PHP lo programé para devolver el string "No hay datos". (hace echo "no hay datos"; )

El código que pongo aquí funciona muy bien en windows 7.( 32 y 64) , pero cuando compilo para android NO. Si recibe un objeto funciona bien, pero sino, se cuelga y se cierra.


procedure TFmMain.RESTRequest1AfterExecute( Sender: TCustomRESTRequest);
var
i : Integer;
begin


if assigned(RESTResponse1.JSONValue) then
memo1.Lines.Text := TJson.Format(RESTResponse1.JSONValue) ;
else
memo1.Lines.Text := RESTResponse1.Content;

end;

DX7, Android 6, MotoG3

jhonny
29-11-2016, 22:21:27
¿De casualidad te muestra "Error in AsyncTask"?, si es así muéstranos el llamado a RESTRequest1.Execute

Si este no es el error que sale, dinos cuál es.

NicolasP
02-12-2016, 13:06:58
Jhonny :
No me dice ningún error , se va al fondo y cuando la traigo se reinicia. La verdad no se bien como depurar en android,
tal vez me falte configurar algo para que me diga los errores. Gracias por tu interés.

Memo1.Lines.clear;
AniIndicator1.Enabled := true;
AniIndicator1.visible := true;
Hilo := THilo.Create(True);
Hilo.Start;
while not Hilo.Finished do
begin
sleep(20);
Application.ProcessMessages;
end;
AniIndicator1.Enabled := false;
AniIndicator1.visible := false;


proceso en el thread


procedure THilo.Execute;
begin
FmMain.RestClient1.BaseURL := sitio\consulta.php?doc='+ FmMain.Ed_idcliente.text;
FmMain.RestRequest1.Execute;
end;


Insisto , si viene un registro en json funciona perfecto, tanto en win como en android.

jhonny
02-12-2016, 15:28:39
No me dice ningún error , se va al fondo y cuando la traigo se reinicia. La verdad no se bien como depurar en android,
tal vez me falte configurar algo para que me diga los errores.

Sólo sería cuestión de poner el "Build Configuration" en modo Debug y desplegar el apk con F9, pero no nos centremos en esto, voy a ir directo a lo que necesitas en este caso en particular.

Prueba con este cambio a ver qué tal:

1) Quita lo que tienes en RESTRequest1AfterExecute.

2) Cambias el código principal que me has mostrado por este:


FmMain.RestClient1.BaseURL := 'sitio\consulta.php?doc='+ FmMain.Ed_idcliente.text;
Memo1.Lines.clear;
AniIndicator1.Enabled := true;
AniIndicator1.Visible := true;

FmMain.RESTRequest1.ExecuteAsync(
procedure
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
if assigned(RESTResponse1.JSONValue) then
Memo1.Lines.Text := TJson.Format(RESTResponse1.JSONValue) ;
else
Memo1.Lines.Text := RESTResponse1.Content;

AniIndicator1.Enabled := false;
AniIndicator1.Visible := false;
end);
end, False);


Insisto , si viene un registro en json funciona perfecto, tanto en win como en android.

Mi teoría es que cuando el dato no existe el motor se demora un poco más en devolverte el resultado, así que la app entra al "sleep(20);" que tienes ahí y como al Android estas cosas no le gustan para nada en el hilo principal, se cierra de inmediato.

P.D: Para entender un poco más acerca del método ExecuteAsync que he usado puedes leer mi artículo en PuroDelphi http://purodelphi.com/2015/11/18/peticion-rest-en-segundo-plano/

NicolasP
03-12-2016, 22:44:07
Hace exactamente lo mismo con el código que me pasaste. También le saqué el AniIdicator...pero igual.
Me queda probar de instalarlo en otro Andorid... tengo el 6.0 .:confused: