Tento článek je prvním ze série "připomenutí" která vám pomohou udělat vaši aplikaci co nejvýkonnější. Dnes se podíváme na Fast Renderers, které pomohou optimalizovat běh aplikace na Androidu.
Co jsou Fast Renderers?
Ovladací prvky v Xamarin.Forms se zobrazují v nativním prostředí pomocí konceptu Renderers. Drtivá většina Android Renderers dědí od třídy ViewRenderer<TView, TNativeView>
která je definována jako:
public abstract class ViewRenderer<TView, TNativeView> : VisualElementRenderer<TView>, IViewRenderer, ITabStop, AView.IOnFocusChangeListener where TView : View where TNativeView : AView
Jdeme-li hlouběji, zjistíme, že VisualElementRenderer<TElement>
je definována jako:
public abstract class VisualElementRenderer<TElement> : FormsViewGroup, IVisualElementRenderer, IEffectControlProvider where TElement : VisualElement
Zde je FormsViewGroup
jen lehce upravená Xamarin.Forms verze nativní třídy ViewGroup
. Skutečný nativní view (jako Button
) je uvnitř tohoto vnějšího ViewGroup
. Tímto způsobem je možné snadno a univerzálně dát všem ovladacím prvkům "univerzální" chování jako padding, zpracování gest a jiné. Má to však i výkonnostní dopad - každý ovladací prvek který vytvoříte vygeneruje dvě view v hierarchii Androidu. Ačkoliv to není problém v jednoduchých stránkách aplikace, v případě velkých a složitých seznamů se to stává výraznějším problémem. Naštěstí nás mohou zachránit Fast Renderers. Když ve svém projektu povolíme Fast Renderers, nahradí automaticky výchozí renderery pro nejčastěji používané ovladací prvky:
Button
Image
Label
Frame
Fast Renderers již nedědí od
ViewRenderer<TView, TNativeView>
a namísto toho zpracovávají layout a gesta přímo pomocí nativního view. Pro příklad se můžete podívat na implementace Fast Rendereru proButton
zde na GitHubu.
Jak povolit Fast Renderers?
Fast Renderers jsou experimentální funkcí a nejsou automaticky povoleny. Můžete je zapnout pro celý projekt přidáním následujícího řádku kódu před voláníForms.Init()
v MainActivity
vašeho Android projektu:
Forms.SetFlags("FastRenderers_Experimental");
Uvnitř frameworku se takto nastaví flag, který se následně kontroluje uvnitř metody LoadApplication
ve FormsAppCompactActivity
jak lze vidět zde ve zdrojovém kódu. Je důležité zmínit, že Fast Renderers jsou kompatibilní pouze s app compat aktivitou a mají vliv pouze na Androidu.