앱 완전 구동 후 작업 수행 하기(라이프 사이클 이벤트 / 타이머 이용)

2014.07.11 16:04

앱에서 초기화 작업을 FormCreate(또는 FormShow)에서 하게되면 구동시간이 길어지고, 오류가 발생하는 경우 앱이 정상구동되지 않을 수(검은화면만 표시) 있습니다.


그렇기 때문에 앱이 완전 구동된 이후에 초기화 작업을 진행하도록 하기 바랍니다.

앱 완전 구동 후 동작하기 위해서는 아래와 같은 2가지 방법이 있습니다.

  1. 모바일 앱 라이프 사이클 이용하기
  2. 타이머를 이용해 구동 이후 이벤트 받아 처리하기

모바일 앱 라이프 사이클 이용하기

모바일(안드로이드, iOS)는 라이프 사이클 이벤트를 제공합니다.(http://blog.hjf.pe.kr/114 참고)

아래 코드를 참고하기 바랍니다.

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Platform;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FInit: Boolean;
    procedure InitData;

    function HandleAppEvent(AAppEvent: TApplicationEvent;
      AContext: TObject): Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
var
  EventService: IFMXApplicationEventService;
begin
  FInit := False;
  if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(EventService)) then
    EventService.SetApplicationEventHandler(HandleAppEvent)
  else
    InitData;
end;

function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
begin
  case AAppEvent of
    TApplicationEvent.FinishedLaunching, 
    TApplicationEvent.BecameActive:
        InitData;
  end;
  Result := True;
end;

procedure TForm1.InitData;
begin
  if FInit then
    Exit;

  // 데이터 및 컨트롤 초기화

  FInit := True;
end;

end.


참고로 FinishedLaunching 이벤트가 iOS에서 발생하지 않습니다. 그래서 iOS의 경우 BecameActive 이벤트를 이용해 초기화 진행했습니다.

BecameActive 이벤트는 앱 활성화 될 때 마다 발생하기 때문에 중복방지 코드(if FIni then Exit;)를 추가했습니다.

타이머를 이용해 구동 이후 이벤트 받기

타이머(TTimer) 컴포넌트를 폼에 추가 후 실행하면, 앱이 구동된 이후 타이머 이벤트가 발생합니다.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  InitData;
end;

관련글



저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키 FMX, Log.d, 델파이, 라이프사이클

iOS개발 시 Log.d로 기록한 로그 확인

2014.07.11 15:53

iOS에서 Log.d로 기록한 로그 확인

기능을 확인하는 도중 상태 값이나, 그 당시의 데이터 값을 알고 싶을 때 로그를 사용합니다.

파이어몽키에서는 이미 Log.d라는 함수를 제공하므로 우리는 Log.d를 사용하면 됩니다.


▶ Log.d 사용

아래와 같이 추상 클래스의 클래스 함수로 기능이 구현되어 있는데요.(사실 구현은 중요하지 않습니다. 사용법만 알면 됩니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type
  Log = class abstract
  strict private
    class var FLogger: IInterface;
    class constructor Create;
  public
  type
    ToStringFunc = reference to function(O: TObject) : String;
 
    class procedure d(const Msg: String); overload;
    class procedure d(const Fmt: String; const Args: array of const); overload;
    class procedure d(const Tag: String; const Instance : TObject; const Msg : String); overload;
    class procedure d(const Tag: String; const Instance : TObject; const Method : String; const Msg : String); overload;
    class procedure TimeStamp(const Msg: String); overload;
    class function ObjToString(const Instance : TObject) : String;
    class function ArrayToString(const AArray : TEnumerable<tfmxobject>) : String; overload;
    class function ArrayToString(const AArray : TEnumerable<tfmxobject>; MakeStr : ToStringFunc) : String; overload;
    class procedure DumpFmxObject(const O: TFmxObject; Nest: Integer = 0);
  end;</tfmxobject></tfmxobject>

아래와 같이 간단하게 사용할 수 있습니다.(uses FMX.Types)
1
Log.d('Hello!! Log.d');

❑ iOS 장비 로그 확인하기

iOS 장비를 연결하고 응용프로그램에서 iPhone 구성 유틸리티를 실행합니다.

(설치되지 않은 분들은 설치 하세요.)


iPhone 구성 유틸리티의 좌측 메뉴에서 장비를 선택하고 [콘솔] 탭을 선택해 로그를 확인할 수 있습니다.


추가(2015-07-01)

iOS 콘솔 앱을 설치해서 로그를 확인할 수 있습니다.

http://lemonjar.com/iosconsole/


❑ iOS Simulator 로그 확인하기

iOS 시뮬레이터의 메인메뉴에서 Open System Log를 선택 해 콘솔창을 호출합니다.


콘솔을 실행하면 좌측의 로그 목록에서 system.log를 선택하면 앱에서 Log.d로 출력한 로그를 확인할 수 있습니다.

한가지 팁으로 상당히 많은 로그 중 좌측상단의 검색어 입력 란에 앱의 이름을 넣으면 해당 앱에서 출력한 로그만 확인할 수 있습니다.



관련글






저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키 Firemonkey, ios, Log.d