2012-04-05 42 views
1

我有這個代碼來加載圖標和應用程序名稱,但它對於超過50個應用程序很慢,它需要7-8秒加載,如何加載應用程序名稱和圖標更快?如何提高圖標和應用程序名稱的加載性能?

private void loadApps() { 
      Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
      mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
      InternalDataManager.apps = getPackageManager() 
        .queryIntentActivities(mainIntent, 0); 
      PackageManager pm = getPackageManager(); 

      for (int i = 0; i < InternalDataManager.apps.size(); i++) { 

       ResolveInfo info = InternalDataManager.apps.get(i); 

          // PInfo holds name and icon 
       PInfo infoP = new InternalDataManager.PInfo(); 

       infoP.appname = info.activityInfo.applicationInfo.loadLabel(pm) 
         .toString(); 


       infoP.icon = info.activityInfo.loadIcon(pm); 

       infoP.pname = info.activityInfo.applicationInfo.packageName; 



      } 
     } 
+0

該代碼應該需要幾毫秒的時間才能運行。你怎麼確定這是你的問題的代碼塊? Traceview指出,對於那些速度緩慢的具體電話,這是什麼意思? – CommonsWare 2012-04-05 11:55:14

+0

加載圖標需要時間,真的時間 – Ata 2012-04-05 12:02:07

+0

'loadIcon()'應該花費很少的時間。這個示例項目可以在一眨眼之間提出一個充滿了可啓動項目的ListView:https://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot – CommonsWare 2012-04-05 12:29:25

回答

1

這個輔助函數檢索所有與應用程序的名稱,包裝名稱,版本號和-code以及圖標安裝的應用程序。方法getPackages()返回一個包含所有應用程序的ArrayList。你應該試試這個...

class PInfo { 
    private String appname = ""; 
    private String pname = ""; 
    private String versionName = ""; 
    private int versionCode = 0; 
    private Drawable icon; 
    private void prettyPrint() { 
     Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode); 
    } 
} 

private ArrayList<PInfo> getPackages() { 
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */ 
    final int max = apps.size(); 
    for (int i=0; i<max; i++) { 
     apps.get(i).prettyPrint(); 
    } 
    return apps; 
} 

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) { 
    ArrayList<PInfo> res = new ArrayList<PInfo>();   
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0); 
    for(int i=0;i<packs.size();i++) { 
     PackageInfo p = packs.get(i); 
     if ((!getSysPackages) && (p.versionName == null)) { 
      continue ; 
     } 
     PInfo newInfo = new PInfo(); 
     newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString(); 
     newInfo.pname = p.packageName; 
     newInfo.versionName = p.versionName; 
     newInfo.versionCode = p.versionCode; 
     newInfo.icon = p.applicationInfo.loadIcon(getPackageManager()); 
     res.add(newInfo); 
    } 
    return res; 
} 
+0

它列出了所有的服務和其他活動,我需要啓動器活動 – Ata 2012-04-05 12:11:42

+0

我同意第一代碼需要24秒。限制代碼需要18秒。但仍然沒有使用packageManager是200毫秒。 – Tefel 2012-08-23 20:53:59

相關問題