2012-01-10 5 views
-3
public class PackageTabActivity extends ListActivity{ 
HashMap<String,Object> hm ; 
ArrayList<HashMap<String,Object>> applistwithicon ; 
    private static final String APP_NAME = "app_name"; 
    private static final String APP_ICON = "app_icon"; 
    private static final String APP_SIZE = "app_size"; 

    Method getPackageSizeInfo = null; 
    PackageManager pm ; 
@Override 
public void onCreate(Bundle icicle){ 
    super.onCreate(icicle); 
    pm = getPackageManager(); 

    applistwithicon = new ArrayList<HashMap<String,Object>>(); 

    try { 
     getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class); 
    } catch (SecurityException e1) { 

     e1.printStackTrace(); 
    } catch (NoSuchMethodException e1) { 

     e1.printStackTrace(); 
    } 
    new AppDetails().execute(); 
} 

private boolean isSystemPackage(PackageInfo pkgInfo) { 
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true 
      : false; 
} 


class AppDetails extends AsyncTask<Void, Void, ArrayList<HashMap<String , Object>>> 
{ 
    private long app_apk_size; 
    ProgressDialog mDialog; 
    @Override 
    public void onPreExecute() 
    { 
      mDialog = new ProgressDialog(PackageTabActivity.this); 
      mDialog.setCancelable(true); 
      mDialog.setMessage("Loading... "); 
      mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      mDialog.setProgress(0); 
      mDialog.show(); 
    } 
    @Override 
    protected ArrayList<HashMap<String, Object>> doInBackground(
      Void... params) { 

      ArrayList<HashMap<String,Object>> app = new ArrayList<HashMap<String,Object>>(); 

     List<PackageInfo> packs = getPackageManager().getInstalledPackages(0); 

     long [] size = new long[packs.size()]; 


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

      PackageInfo p = packs.get(i); 



      if(!isSystemPackage(p)) 
      { 
        /* String package_name = p.applicationInfo.packageName; 
        appname[i] = p.applicationInfo.loadLabel(getPackageManager()).toString(); 
        icon[i] = p.applicationInfo.loadIcon(getPackageManager()); 
        size[i] = GetSize(package_name); 
       // Log.v("Test", "app_name = " +appname[i]+" app_size = "+size[i]);*/ 


      app= GetSize(p); 


      } 


     } 


      // 


     return app; 
    } 
    private ArrayList<HashMap<String, Object>> GetSize(final PackageInfo pInfo) 
{ 
try 
{ 
    getPackageSizeInfo.invoke(pm, pInfo.applicationInfo.packageName, new IPackageStatsObserver.Stub() 
    { 
     public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException 
     { 
      app_apk_size= pStats.codeSize/1024; 
      if(app_apk_size!=0) 
      { 
       // If I uncomment-out the below commented-out lines, I get 
       // an incorrect result: 

       // hm = new HashMap<String, Object>(); 
       // hm.put(APP_SIZE, app_apk_size); 
       // hm.put(APP_NAME, pInfo.applicationInfo.loadLabel(pm)); 
       Log.v("apksize", "appsize = "+app_apk_size+"appname = "+pInfo.applicationInfo.loadLabel(pm)); 
       // applistwithicon.add(hm); 
      } 
     } 
    }); 
} 
catch(IllegalAccessException e) {} 
catch(IllegalArgumentException r) {} 
catch(InvocationTargetException w){} 
return applistwithicon; 
} 
    @Override 
    public void onPostExecute(ArrayList<HashMap<String, Object>> result) 
    { 
     mDialog.dismiss(); 
     CustomAdapterList myAdapter = new CustomAdapterList(result,PackageTabActivity.this); 

     setListAdapter(myAdapter); 

    } 
} 

}의 ArrayList와 HashMap의 혼란

하지만 주석을 해제 아웃 경우 주석 처리 된 라인을, 잘못된 결과가 기록됩니다.

이유를 아는 사람이 있습니까?

+0

이것은 ArrayList 또는 HashMap과 어떤 관련이 있습니까? –

+0

그리고 어떤 일이 벌어 질지 예상됩니다. –

+0

내 질문 업데이트 .. – Sunny

답변

1

무엇이 인지 모르겠지만 메소드를 두 번 호출하는 대신 결과를 var에 넣으십시오.