2017-09-29 13 views
4

저는 Rest 구성 요소를 사용하여 게시 양식에서 데이터를 반환하는 Android 응용 프로그램을 만드는 데 Delphi 10.2를 사용하고 있습니다. 데이터를로드하기 위해 버튼을 누르면 약 3 초 동 안 정지 한 후 정상적으로로드됩니다. 사용자가 3 초 동결 후 즉시 앱이 종료되는 양식의 컨트롤을 클릭 (또는 터치)하려고 시도하지만 사용자가 앱을 터치하지 않은 경우 데이터가 정상적으로로드되었습니다.왜 내 Android 앱이 갑자기 종료됩니까?

그 이유는 무엇이며 어떻게 수정해야합니까?

procedure TfrmMain.RESTRequest1AfterExecute(Sender: TCustomRESTRequest); 
var 
return_response: string; 
begin 
    if RESTResponse1.StatusCode = 200 then begin 
    //fill years 
    return_response := RESTResponse1.Content; 

    memo1.text := return_response; 

    end; 

end. 
+4

먼저 UI가 고정되지 않고 호출이 별도의 스레드에서 실행되도록 ExecuteAsync를 사용해야합니다. Execute (UI와 동일한 스레드에서 실행되는) 호출은 UI를 고정시킵니다. 앱이 xx 초 동결되면 안드로이드에서 닫습니다. –

+1

executeasync를 시도해보고 알려주세요! 또한 비동기 버전은 익명 메소드 광고 프로 시저를 사용할 수 있으며 요청 실행이 완료되면 실행됩니다. –

+0

@AlbertoMiola는 답으로 게시하고 선택하길 원할 경우이 작업에 감사드립니다. – Wel

답변

8
:

I 버튼에 사용하는 코드는 위해 RESTClient, RESTRequest 및 RESTResponse

여기

와 내가 데이터를 가져 오기 위해 사용하는 코드입니다 내가 3 개 구성 요소를 사용

RESTRequest1.Execute; 

입니다

모바일 플랫폼에서는 이 아니기 때문에이 UI와 동일한 스레드에서 실행되므로 항상 ExecuteAsync을 사용해야합니다. 대신 Execute과 동일한 스레드에서 실행되므로 요청이 처리되는 동안 정지합니다. 안드로이드는 잠시 후 반응이 없으면 (= 얼어 붙은 상태) 앱을 닫습니다. 이것이 문제입니다!

ExecuteAsync 방법의 사용은 강력히 모바일 플랫폼에 권장됩니다

더 정확히 말하면, 여기에 문서입니다. 실행중인 요청이

를 반환하는 두 번째 또는 두 이상 걸리는 경우 아이폰 OS (가능성 안드로이드)는 메인 스레드가 응답하지 않는 것으로 간주 경우 응용 프로그램을 종료합니다, 즉, 당신은 더 많은 정보 here를 찾을 수 있습니다.


당신이 문서에서 볼 수있는 기능 ExecuteAsync는 익명의 절차를 취 유용한 매개 변수가 있습니다. 이 절차의 코드는 ExecuteAsync이 작업을 마친 후에 호출됩니다. 예를 들면 다음과 같습니다.

RESTRequest1.ExecuteAsync(
procedure 
begin 
    ShowMessage('Finished!'); 
end;); 

이것은 매우 쉽습니다. 다른 매개 변수도 기본적으로 값이 있기 때문에 입력 할 필요가 없습니다. 다시 한 번, 문서를 보면 ASynchronized: Boolean = True;이 표시되므로 익명 proc 다음에 두 번째 매개 변수를 True로 설정하면 관련이 없습니다.