Xamarin. Android performansı
Xamarin. Android ile oluşturulan uygulamaların performansını artırmanın birçok tekniği vardır. Toplu olarak bu teknikler, bir CPU tarafından gerçekleştirilen iş miktarını ve bir uygulama tarafından tüketilen bellek miktarını önemli ölçüde azaltabilir. Bu makalede bu teknikler açıklanmakta ve açıklanmaktadır.
Performansa genel bakış
Kötü uygulama performansı, kendisini pek çok şekilde sunar. Bu, bir uygulamanın yanıt vermemeye başlamasına neden olabilir, yavaş kaydırmaya neden olabilir ve pil ömrünü azaltabilir. Ancak, performansı iyileştirmek yalnızca verimli koddan daha fazlasını içerir. Kullanıcının uygulama performansı deneyimi de göz önünde bulundurulmalıdır. Örneğin, kullanıcının diğer etkinlikleri gerçekleştirmesini engellemeden yürütülen işlemlerin yürütülmesi, kullanıcının deneyimini iyileştirmenize yardımcı olabilir.
Xamarin. Android ile oluşturulan uygulamaların performansını ve algılanan performansı artırmak için çeşitli teknikler vardır. Bunlara aşağıdakiler dahildir:
- Düzen hiyerarşilerini iyileştirme
- Liste görünümlerini iyileştirme
- Etkinliklerdeki olay Işleyicilerini kaldırma
- Hizmetlerin kullanım süresini sınırla
- Bildirim sırasında kaynakları serbest bırakma
- Kullanıcı arabirimi gizliyse sürüm kaynakları
- Görüntü kaynaklarını iyileştirme
- Kullanılmayan görüntü kaynaklarını atma
- Floating-Point aritmetiğini önleyin
- Iletişim kutularını kapat
Not
Bu makaleyi okumadan önce, Xamarin Platformu kullanılarak oluşturulan uygulamaların bellek kullanımını ve performansını geliştirmek için platforma özgü olmayan tekniklerin tartışıldığı platformlar arası performansıokumanız gerekir.
Düzen hiyerarşilerini iyileştirme
Bir uygulamaya eklenen her düzen başlatma, düzen ve çizim gerektirir. LinearLayoutweight Her çocuk iki kez ölçülerek, düzen geçişi parametresini kullanan örnekleri yuvalama sırasında pahalı olabilir. İç içe geçmiş örneklerinin kullanılması LinearLayout derin bir görünüm hiyerarşisine yol açabilir. Bu, bir ' de olduğu gibi, birden çok kez daha karmaşık olan mizanpajların performansının düşmesine yol açabilir ListView . Bu nedenle, performans avantajları çarpılacağı için bu tür mizanpajların iyileştirildiğinden emin olmanız önemlidir.
Örneğin, bir LinearLayout simge, başlık ve açıklama içeren bir liste görünümü satırı için öğesini göz önünde bulundurun. , LinearLayoutImageView İki örnek içeren bir ve dikey içerir LinearLayoutTextView :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="5dip">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="5dip"
android:src="@drawable/icon" />
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="Mei tempor iuvaret ad." />
<TextView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="marquee"
android:text="Lorem ipsum dolor sit amet." />
</LinearLayout>
</LinearLayout>
Bu düzen 3 düzeylidir ve her satır için flalandığınızda boşa çıkarslanmıştır ListView . Ancak, aşağıdaki kod örneğinde gösterildiği gibi, düzen düzleştirilerek artırılabilir.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="5dip">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="5dip"
android:src="@drawable/icon" />
<TextView
android:id="@+id/secondLine"
android:layout_width="fill_parent"
android:layout_height="25dip"
android:layout_toRightOf="@id/icon"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:singleLine="true"
android:ellipsize="marquee"
android:text="Lorem ipsum dolor sit amet." />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/icon"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_above="@id/secondLine"
android:layout_alignWithParentIfMissing="true"
android:gravity="center_vertical"
android:text="Mei tempor iuvaret ad." />
</RelativeLayout>
Önceki 3 düzey hiyerarşi 2 düzeyli bir hiyerarşiye düşürüldü ve tek bir, RelativeLayout iki LinearLayout örneği değiştirdi. Her bir satır için Düzen dinlenilerek önemli bir performans artışı kazanılabilir ListView .
Liste görünümlerini iyileştirme
Kullanıcılar örnekler için Kesintisiz kaydırma ve hızlı yükleme süreleri bekler ListView . Ancak, her liste görünümü satırı derin iç içe görünüm hiyerarşileri içerdiğinde veya liste görünümü satırları karmaşık düzenler içerdiğinde, kaydırma performansı düşebilir. Ancak, performansın düşmesine engel olmak için kullanılabilen teknikler vardır ListView :
- Satır görünümlerini yeniden kullanma daha fazla bilgi Için bkz. satır görünümlerini yeniden kullanma.
- Mümkün olan yerlerde düzenleri düzleştirin.
- Bir Web hizmetinden alınan önbellek satırı içeriği.
- Görüntü ölçeklendirmeden kaçının.
Toplu olarak bu teknikler, ListView örneklerin düzgün şekilde kaydırmasına yardımcı olabilir.
Satır görünümlerini yeniden kullan
Bir içinde yüzlerce satır görüntülenirken ListView , View ekranda yalnızca küçük bir kez görüntülenirken yüzlerce nesne oluşturmak için bellek atık olur. Bunun yerine, yalnızca View Ekrandaki satırlarda görünen nesneler, bu yeniden kullanılan nesnelere yüklenen View ile belleğe yüklenebilir. Bu, yüzlerce ek nesnenin örneklenmesini ve zamandan ve belleğin kaydedilmesini engeller.
Bu nedenle, bir satır ekrandan kaybolduğunda, aşağıdaki kod örneğinde gösterildiği gibi, görünümü yeniden kullanım için bir sıraya yerleştirilebilir:
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView; // re-use an existing view, if one is supplied
if (view == null) // otherwise create a new one
view = context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, null);
// set view properties to reflect data for the given row
view.FindViewById<TextView>(Android.Resource.Id.Text1).Text = items[position];
// return the view, populated with data, for display
return view;
}
Kullanıcı kaydırıldığında, ListViewGetView görüntülenecek yeni görünümler istemek için geçersiz kılma işlemini çağırır. varsa, parametre içinde kullanılmamış bir görünüm geçirir convertView . Bu değer null daha sonra kod yeni bir View örnek oluşturursa, convertView Özellikler sıfırlanabilir ve yeniden kullanılabilir.
Daha fazla bilgi için bkz. veri içeren bir ListView doldurmabölümünde satır görünümü yeniden kullanımı .
Etkinliklerdeki olay Işleyicilerini kaldırma
Android çalışma zamanında bir etkinlik yok edildiğinde, mono çalışma zamanında hala canlı olabilir. Bu nedenle, Activity.OnPause çalışma zamanının yok edilmiş bir etkinliğe başvuruyu tutmasını engellemek için içindeki dış nesnelere olay işleyicilerini kaldırın.
Bir etkinlikte, sınıf düzeyinde olay işleyicileri bildirin:
EventHandler<UpdatingEventArgs> service1UpdateHandler;
Ardından, etkinlikte, içindeki gibi işleyicileri uygulayın OnResume :
service1UpdateHandler = (object s, UpdatingEventArgs args) => {
this.RunOnUiThread (() => {
this.updateStatusText1.Text = args.Message;
});
};
App.Current.Service1.Updated += service1UpdateHandler;
Etkinlik çalışır durumdan çıktığında OnPause çağrılır. OnPauseUygulamada, işleyicileri aşağıdaki gibi kaldırın:
App.Current.Service1.Updated -= service1UpdateHandler;
Hizmetlerin kullanım süresini sınırla
Bir hizmet başlatıldığında, Android hizmet işlemini çalışır halde tutar. Bu işlem, belleği disk belleğine alınamayan veya başka bir yerde kullanıldığından işlemi pahalı hale getirir. Gerekli olmadığında bir hizmetin çalışır durumda bırakılması, bellek kısıtlamaları nedeniyle bir uygulamanın kötü performans sergileme riskini artırır. Ayrıca, Android 'in önbelleğe aldığı işlem sayısını azalttığı için uygulama geçişini daha az verimli hale getirir.
Bir hizmetin kullanım ömrü, IntentService kendisini başlatan bir işlem tamamlandıktan sonra kendisini sonlandıran bir ile sınırlı olabilir.
Bildirim sırasında kaynakları serbest bırakma
Uygulama yaşam döngüsü sırasında, OnTrimMemory Cihaz belleği azaldığında geri arama bir bildirim sağlar. Bu geri çağırma, aşağıdaki bellek düzeyindeki bildirimleri dinlemek için uygulanmalıdır:
TrimMemoryRunningModerate– uygulama, bazı gereksiz kaynakları serbestTrimMemoryRunningModerateTrimMemoryRunningLow– uygulama gereksiz kaynakları serbestTrimMemoryRunningLow.TrimMemoryRunningCritical– uygulama, olabildiğince kritik olmayan çok sayıda işlemTrimMemoryRunningCritical.
Ayrıca, uygulama işlemi önbelleğe alındığında, geri arama ile aşağıdaki bellek düzeyi bildirimleri alınabilir OnTrimMemory :
TrimMemoryBackground– Kullanıcı uygulamaya geri dönerse hızlı ve verimli bir şekilde yeniden oluşturulmuş kaynakları serbest bırakabilirsiniz.TrimMemoryModerate– kaynakların serbest bırakılması sistemin daha iyi genel performans için diğer işlemlerin önbelleğe alınmasını sağlamaya yardımcı olabilir.TrimMemoryComplete– daha önce bellek kurtarılamazsa uygulama işlemi yakında sonlandırılır.
Bildirimler, alınan düzeye göre kaynak serbest bırakarak yanıt verilmelidir.
Kullanıcı arabirimi gizliyse sürüm kaynakları
Kullanıcı başka bir uygulamaya geçtiğinde uygulamanın kullanıcı arabirimi tarafından kullanılan tüm kaynakları serbest bırakın. Bu, daha sonra Kullanıcı deneyimi kalitesiyle ilgili bir etkiye sahip olabileceği için, Android 'in önbelleğe alınmış işlemlere yönelik kapasitesini önemli ölçüde artırabileceği anlamına gelir.
Kullanıcı Kullanıcı ARABIRIMINDEN çıktığında bildirim almak için OnTrimMemory sınıflarda geri çağırma Activity işlemini uygulayın ve TrimMemoryUiHidden düzeyi dinler. Bu, Kullanıcı arabiriminin görünümden gizlendiğini gösterir. Bu bildirim yalnızca uygulamanın Tüm Kullanıcı arabirimi bileşenleri kullanıcıdan gizli hale geldiğinde alınacaktır. Bu bildirim alındığında UI kaynaklarını serbest bırakmak, kullanıcının uygulamadaki başka bir etkinlikten geri gezinmesi durumunda, etkinliği hızlı bir şekilde devam ettirmeye devam eder.
Görüntü kaynaklarını iyileştirme
Görüntüler, uygulamaların kullandığı en pahalı kaynakların bazılarıdır ve genellikle yüksek çözünürlükte yakalanır. Bu nedenle, bir görüntü görüntülenirken cihazın ekranı için gereken çözünürlükte görüntüleyin. Görüntü ekrandan daha yüksek bir çözünürlükte ise, bu, aşağı doğru ölçeklendirilmesi gerekir.
Daha fazla bilgi için bkz. platformlar arası performans kılavuzundaki görüntü kaynaklarını iyileştirme .
Kullanılmayan görüntü kaynaklarını atma
Bellek kullanımına kaydetmek için artık gerekli olmayan büyük görüntü kaynaklarını atmak iyi bir fikirdir. Ancak görüntülerin doğru bir şekilde atıldığından emin olmak önemlidir. Açık bir çağırma kullanmak yerine .Dispose() , nesnelerin doğru kullanımını sağlamak için .Dispose() deyimlerinden yararlanabilirsiniz IDisposable .
Örneğin, bit eşlem sınıfı uygular . BitMapBir blok içindeki bir nesnenin örneğinin oluşturulması, using bloğundan çıkışta doğru şekilde atılanmasını sağlar:
using (Bitmap smallPic = BitmapFactory.DecodeByteArray(smallImageByte, 0, smallImageByte.Length))
{
// Use the smallPic bit map here
}
Atılabilir kaynaklarını serbest bırakma hakkında daha fazla bilgi için bkz. IDisposable kaynaklarını yayınlama.
Floating-Point aritmetiğini önleyin
Android cihazlarda, kayan nokta aritmetiği tamsayı aritmetiğinin yaklaşık 2x daha yavaştır. Bu nedenle, kayan nokta aritmetiğini mümkünse tamsayı aritmetiği ile değiştirin. Ancak son donanımlarda ve floatdouble aritmetik arasında yürütme süresi farkı yoktur.
Not
Tamsayı aritmetiği için bile bazı CPU'larda donanım bölme özellikleri eksiktir. Bu nedenle, tamsayı bölme ve mod işlemleri genellikle yazılımda gerçekleştirilir.
İletişim Kutularını Kapatın
sınıfını (veya herhangi bir iletişim kutusunu veya uyarıyı) kullanırken, iletişim kutusunun amacı tamamlandığında yöntemini aramak yerine ProgressDialogHide yöntemini Dismiss çağırabilirsiniz. Aksi takdirde iletişim kutusu hala canlı olur ve bir başvuru tutarak etkinliği sızdıracak.
Özet
Bu makalede, Xamarin.Android ile yerleşik uygulamaların performansını artırmaya yönelik teknikler açıklanmıştır ve açıklanmıştır. Bu teknikler topluca CPU tarafından gerçekleştirilen iş miktarını ve bir uygulama tarafından tüketilen bellek miktarını önemli ölçüde azaltabilirsiniz.