2015-07-02 43 views
5

Ana ekran değiştirme uygulamasında, onları uygulama çekmecesinin içine koymak için tüm yüklü uygulamaların bir listesini almam gerekiyor. Bu nedenle, aşağıdaki yöntem her uygulamada çalışır;resolveInfo.loadLabel() neden bu kadar yavaş yavaş?

public static App fromResolveInfo (Context context, PackageManager pacMan, AppManager appManager, ResolveInfo resInf) 
{ 
    String label = resInf.loadLabel (pacMan).toString(); 
    String packageName = resInf.activityInfo.applicationInfo.packageName; 
    String activityName = resInf.activityInfo.name; 

    App app = new App (context, appManager); 
    app.setLabel (label); 
    app.setPackageName (packageName); 
    app.setActivityName (activityName); 

    AppIcon icon = null; 
    if (appManager.isIconPackLoaded()) 
     icon = appManager.getIconPack().getIconForApp (app); 
    if (icon == null) 
     icon = appManager.getIconPack().getFallbackIcon (resInf.loadIcon (pacMan)); 

    app.setIcon (icon); 

    return app; 
} 

sorun burada bir darboğaz olduğunu ve başlangıçta tahmin ettiği gibi simgeler o yükleme olmadığıdır. Yöntemin ilk satırı (String label = resInf.loadLabel (pacMan).toString();), 0 ile 250 milisaniye arasında (nispeten yüksek uçlu bir cihazda) herhangi bir yere çıkabilir. Eski cihazlarda, bu gerçek bir sorun haline gelir.
Testlerimde, daha yavaş bir cihaz çok görevli olduğunda ve herhangi bir nedenle uygulama çekmecesinin yeniden yüklenmesi gerektiğinde, bu işlemin tamamlanabilmesi için 30 saniye'a kadar sürebileceğini fark ettim (yüklü tüm uygulamalarda)).

Önbellekleme bunun için potansiyel bir çözüm sunabilir, ancak sonra bir uygulamanın adı değişirse (bu arada) ne olur? Etiketleri önbellekten almalı ve ardından tüm uygulamalarda ayrı bir iş parçacığıyla döngü yapmalı ve değiştirdikleri etiketleri düzeltmeliyim. Bu bir çözüm sunabilir, ancak gerçek bir iyi çözümden çok kirli bir saldırıya benziyor.

Bir uygulamanın etkinliğinin etiketini almanın daha hızlı bir yolu var mı? Ayrıca, Android'in bir uygulamanın etiketini alması neden bu kadar gülünç bir şekilde uzun sürüyor ve/veya bu konuda yapabileceğim bir şey var mı? Eğer applicationInfo yürütmek için daha az kod vardır dan birini fark Bu iki yöntemden için Android kaynak kodunu karşılaştırırsanız

String label = (String) resInf.activityInfo.applicationInfo.loadLabel(pacMan); 

:

+1

"Bir uygulamanın adı değişiyorsa (ki arada sırada)?" - İlgili yayınları dinleyin ve belirli ad değişikliği için önbelleğinizi güncelleyin. Böyle bir değişiklik yalnızca uygulamalar yüklendiğinde, güncellendiğinde veya kaldırıldığında ortaya çıkar. "Android'in bir uygulamanın etiketini alması neden bu kadar gülünç bir şekilde uzun sürüyor?" - Bu davranışı görmedim. Bu sorunun tam olarak nerede olduğunu belirlemek için Traceview kullanıyor musunuz? – CommonsWare

+0

@CommonsWare Uygulamam çalışırken yalnızca bu tür yayınları almayacak mıyım? Bu, uyguladığım başlatıldığında ihtiyaç duyduğum yüklü uygulamaların ilk listesini almakla ilgilidir. Gözlemlerim, bir eylemin ne zaman başladığı ve tamamlandığı zaman arasındaki zaman damgalarının bir (biraz eski moda, belki de) komünizminden geldi. Şimdi Traceview üzerinden kontrol ettim ve bana aynı sonucu veriyor. Yine de Traceview'i ilk defa kullanıyorum. Eğer sonuçları yanlış yorumluyorsam lütfen affedin. http://stuff.robinj.be/stackoverflow/31188658-AsyncLoadApps.trace – RobinJ

+0

"Uygulamam çalışırken yalnızca bu tür yayınları almam mı gerekir?" -- Evet. İşleminiz başladığında bu bilgileri yenilemeniz gerekir. "Bu, uygulama başlatıldığında ihtiyaç duyduğum yüklü uygulamaların ilk listesini almakla ilgili" - umarız, bir ana ekran yazıyorsanız, yüklenebilir etkinliklerin listesini almak için daha fazla odaklanabilirsiniz. uygulamaların. [Launchalot örneğim] ile tanımladığınız performans sorunlarını yaşamadım (https://github.com/commonsguy/cw-omnibus/tree/master/Introspection/Launchalot) ve bu örnek * eski *. :-) – CommonsWare

cevap

0

Sen olarak etiketi alabilirsiniz. Belki darboğaz fazladan kodda oturur. Ben şahsen hiç böyle bir sorunu gözlemlemediğim için yürütme sürelerini karşılaştırdım.

+2

Gerçek uygulamanın adını alırsın, aktivitenin etiketini (başlatıcısı), sanırım. Bazı uygulamalar (Google Drive gibi) birden fazla etkinliğe sahiptir. – RobinJ

+0

Evet, bildirim aracının etkinlik etiketinde değil, bildirimden etiketinin etiketini döndürür, ancak sorunuzda "uygulamanın etiketi" ni sormuştunuz. – mhenryk

İlgili konular