2014-10-08 41 views
1

第一次嘗試:的Android - 安裝的應用程序列表獲取時間過長

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);    
    Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); 
    pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent); 
    this.startActivityForResult(pickIntent, MoreIconsConstants.REQUEST_PICK_APPLICATION) 

所需的平均時間 - > 8-10第二

第二次嘗試我試圖讓程序列表中的應用程序列表並在對話框中顯示我的自我列表.----->約4秒...更快但仍然很慢。

第三次嘗試:我將列表存儲在我的首選項文件中,以便將來我立即加載該列表...同時獲取當前列表的背景,如果存在差異更新列表顯示給用戶 - ---也約4秒。

這是奇怪的地方。使用日誌報表我測量了每種方法所需的確切時間。 如果我首先加載從prefferences列表,然後如果i裝入列表首先查詢包管理器通過查詢我再次需要4秒鐘的偏好方法和用於所述查詢方法

0.5秒包管理器 加載它然後從首選項中加載它,查詢方法需要大約4秒,而首選方法需要0.5秒

因此,無論我做什麼,第一種方法都會花費大量時間,第二種方法會立即執行。

有沒有解釋爲此或其他方式加載此列表更快?

我引用我的代碼,這兩種方法

貨清單從喜好方法quering包管理器

private class AppAsyncCaller extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { super.onPreExecute(); } 
    @Override 
    protected Void doInBackground(Void... params) { 
     ArrayList<AppItem> allAppsInDevice2 = new ArrayList<AppItem>(); 
     long timeStart=System.currentTimeMillis(); 
     Intent mainIntent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER); 
     List<ResolveInfo> packages=pm.queryIntentActivities(mainIntent, 0); 
     for(int i=0;i<packages.size();i++){ 
      try{ 
       String packageName=packages.get(i).activityInfo.packageName; 
       AppItem item=getAppItem(packageName,false); 
       if(item!=null){allAppsInDevice2.add(item);} 
      }catch(Exception e){} 
     } 
     Log.w(Long.toString(System.currentTimeMillis()-timeStart),"duration using async caller"); 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { super.onPostExecute(result); } 

} 

貨清單:

private class AppPrefsAsyncCaller extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { super.onPreExecute(); } 
    @Override 
    protected Void doInBackground(Void... params) { 
     long timeStart=System.currentTimeMillis(); 
     String allAppsListString = prefs.getString("allAppsListString", ""); 
     String[] tab=allAppsListString.split("_APPAPPAPP_"); 
     allAppsInDevice.clear(); 
     boolean updateAllApps=false; 
     for(String s:tab){ 
      if(!s.equals("") && !s.equals(" ")){ 
       AppItem item=getAppItem(s,false); 
       if(item!=null){ allAppsInDevice.add(item); } 
      } 
     } 

     Log.w(Long.toString(System.currentTimeMillis()-timeStart),"duration apo pref"); 


     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { super.onPostExecute(result); } 

} 




public AppItem getAppItem(String packageName,boolean getIcon){ 
     AppItem item=new AppItem(); 
     item.packageName=packageName; 
     ApplicationInfo ai=null; 
     try { ai = pm.getApplicationInfo(packageName, 0); } 
     catch (final NameNotFoundException e) {return null; } 
     final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)"); 
     item.appName=applicationName; 
     Intent intent = pm.getLaunchIntentForPackage(packageName); 
     if(getIcon){ 
     Drawable icon=null; 
      if (intent != null) { try { icon = pm.getActivityIcon(intent); } catch (NameNotFoundException e) {} } 
      item.icon=icon; 
     } 

     return item; 
    } 
public class AppItem{ 
    String packageName; 
    String appName; 
    Drawable icon; 
} 
+0

使用Traceview並確定問題的確切位置。 – CommonsWare 2014-10-08 20:34:26

回答

0

您可以與Android PackageManager做到這一點。

下面是一個小的代碼片段。

final PackageManager pm = getPackageManager(); 
//get a list of installed apps. 
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); 

for (ApplicationInfo packageInfo : packages) { 
    Log.d(TAG, "Installed package :" + packageInfo.packageName); 
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir); 
} 
相關問題