RESTRequest.Execute
을 여러 번 실행 한 후에 내 Android
애플리케이션이 무작위로 충돌합니다.Delphi 안드로이드 RESTRequest : 채널이 복구 불가능하게 깨져 버려 처분 될 것입니다.
Firemonkey
으로 개발 중이지만 Android Studio의 DDMS logcat에서 확인하면 오류가 발생할 수 있습니다.
나는 그러나 나는이 발생하지 않도록하는 방법에 대한 우둔 해요, 그것은 일반적으로 응용 프로그램에서 메모리 누수 나타내는 것을 알아 냈다.535-614 /? E/InputDispatcher : 채널 '221d0340 com.mycompany.myappname/com.embarcadero.firemonkey.FMXNativeActivity (server)'~ 채널을 복구 할 수 없게 처리하여 삭제합니다!
- 델파이에서 디버깅을하면 전혀 충돌이 없습니다.
이 내가 주요 양식에 RESTRequest
의 호출 방법은 다음과 같습니다
procedure TFormMain.ExecuteReadingThread(Sender: TObject);
begin
aReadingThread := TThread.CreateAnonymousThread(
procedure()
begin
try
json_data_response_object := DM_KVA.GetDeviceData(communication_token, genset_id);
except
on E: Exception do
begin
// Ignore
end;
end;
TThread.Queue(aReadingThread,
procedure()
begin
// Send UI Adjustments with a Thread-safe method
end);
end);
// Default Threading Settings
aReadingThread.FreeOnTerminate := true;
aReadingThread.OnTerminate := TerminateRead;
aReadingThread.Start;
end;
procedure TFormMain.TerminateRead(Sender: TObject);
begin
// Make Reading Thread take it's place
ExecuteReadingThread(Sender);
end;
을 그리고 이것은 DataModule
에서 실행 어떻게입니다 : 나는이 무작위로 피할 수있는 방법
function TDM_KVA.GetDeviceData(ID_Token: string; ID_Device: string): TJSONObject;
var
JSObj: TJSONObject;
begin
// Set default RESTRequest parameters
RESTRequest_KVA.Resource := 'api/v1/TServerMethods1';
RESTRequest_KVA.Method := REST.Types.TRESTRequestMethod.rmGET;
RESTRequest_KVA.ResourceSuffix := Format('DeviceData/%s', [ID_Device]);
try
// Execute command
RESTRequest_KVA.Execute;
except
on E: EIdHTTPProtocolException do
begin
// Ignore
end;
on E: TRESTResponse.EJSONValueError do
begin
// Ignore
end;
on E: EIdUnknownProtocol do
begin
// Ignore
end;
end;
// Verify response
case (RESTResponse_KVA.StatusCode) of
200:
begin
// Successful readz
JSObj := (RESTRequest_KVA.Response.JSONValue as TJSONObject);
Result := JSObj;
end;
end;
end;
메모리 누수가 내 Android
응용 프로그램을 고장 나게합니까?
'json_data_response_object'는 절대로 처리되지 않습니다. StatusCode가> 200 인 경우'GetDeviceData'의 결과는 정의되지 않습니다. –
'json_data_response_object'를 자유롭게 설정하지 않으면 메모리 누수가 발생합니다. – Machado
N.B : 안드로이드는 ARC 모델로 객체를 관리하지만, json_data_response_object의 범위가 ExecuteReadingThread보다 넓기 때문에 호출 사이에 처리되지 않으므로 포인터가 덮어 쓰여 메모리 누수가 발생합니다. –