Я создал собственный модуль запуска, и когда я захожу в системный ящик приложений (я использовал GridView), каждый раз, когда я касаюсь приложения. Возвращает 5-7 пропускающих кадров
05-03 15:59:17.927 29955-29955/com.journeytech.launcher I/Choreographer: Skipped 38 frames! The application may be doing too much work on its main thread.
05-03 15:59:18.580 29955-29955/com.journeytech.launcher I/Choreographer: Skipped 38 frames! The application may be doing too much work on its main thread.
05-03 15:59:26.429 29955-29955/com.journeytech.launcher I/Choreographer: Skipped 39 frames! The application may be doing too much work on its main thread.
05-03 15:59:27.374 29955-29955/com.journeytech.launcher I/Choreographer: Skipped 37 frames! The application may be doing too much work on its main thread.
Я использую BaseAdapter
для его отображения.
Это весь мой код для DrawerAdapter
public class DrawerAdapter extends BaseAdapter {
Context mContext;
List<Package> pacsForAdapter;
PackageManager packageManager;
public DrawerAdapter (Context c, List<Package> pacs){
mContext =c;
pacsForAdapter = pacs;
packageManager = c.getPackageManager();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return pacsForAdapter.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int pos, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
/*ImageView imageView = new ImageView(mContext);
imageView.setImageDrawable(pacsForAdapter.get(pos).getIcon());
imageView.setLayoutParams(new GridView.LayoutParams(65,65));
imageView.setPadding(3, 3, 3, 3);
return imageView;*/
View itemView;
itemView = LayoutInflater.from(mContext).inflate(R.layout.package_item, arg2, false);
ImageView icon = (ImageView) itemView.findViewById(R.id.pkg_icon);
TextView pkgLabel = (TextView) itemView.findViewById(R.id.pkg_label);
icon.setImageDrawable(pacsForAdapter.get(pos).getIcon());
pkgLabel.setText(pacsForAdapter.get(pos).getLabel());
return itemView;
}
}
И это тот Fragment
, который я использовал.
public class SystemApps extends Fragment {
private Dialog dialog;
private DrawerAdapter drawerAdapterObject;
private GridView drawerGrid;
private PackageManager pm;
private PackageInfo packageInfo;
Intent mainIntent;
View view;
List<ResolveInfo> pacsList;
final List<Package> packages = new ArrayList<>();
ProgressDialog progressDialog;
public SystemApps() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_system_apps, container, false);
mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
drawerGrid = (GridView) view.findViewById(R.id.content);
pm = getActivity().getApplicationContext().getPackageManager();
pacsList = pm.queryIntentActivities(mainIntent, 0);
new AsyncLoadApps().execute();
return view;
}
class AsyncLoadApps extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
Log.e("loading", "loading");
progressDialog = new ProgressDialog(getContext());
progressDialog.setMessage("Loading. Please wait...");
progressDialog.show();
super.onPreExecute();
}
@Override
protected String doInBackground(Void... voids) {
for (ResolveInfo pkg : pacsList) {
Package packageItem = new Package();
packageItem.setIcon(pkg.loadIcon(pm));
packageItem.setPackageName(pkg.activityInfo.packageName);
packageItem.setClassName(pkg.activityInfo.name);
packageItem.setLabel(pkg.loadLabel(pm).toString());
try {
PackageInfo info = pm.getPackageInfo(pkg.activityInfo.packageName, 0);
packageItem.setVersion(info.versionName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (NullPointerException n) {
n.printStackTrace();
}
packages.add(packageItem);
}
Collections.sort(packages, new Comparator<Package>() {
public int compare(Package pkg1, Package pkg2) {
String packageName1 = pkg1.getLabel();
String packageName2 = pkg2.getLabel();
return packageName1.compareToIgnoreCase(packageName2);
}
});
drawerAdapterObject = new DrawerAdapter(getActivity(), packages);
return "Success";
}
@Override
protected void onPostExecute(String result) {
drawerGrid.setAdapter(drawerAdapterObject);
drawerGrid.setOnItemClickListener(new DrawerClickListener(getActivity(), packages, pm));
if (drawerGrid != null) {
progressDialog.dismiss();
}
super.onPostExecute(result);
}
}
@Override
public void onStop() {
super.onStop();
pacsList.clear();
packages.clear();
}
@Override
public void onDestroy() {
super.onDestroy();
pacsList.clear();
packages.clear();
}
public void initPackages() {
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
drawerGrid = (GridView) view.findViewById(R.id.content);
pm = getActivity().getApplicationContext().getPackageManager();
List<ResolveInfo> pacsList = pm.queryIntentActivities(mainIntent, 0);
final List<Package> packages = new ArrayList<>();
}
}
И, наконец, onClickListener
public class DrawerClickListener implements AdapterView.OnItemClickListener {
Context mContext;
List<Package> pacsForAdapter;
PackageManager pmForListener;
public DrawerClickListener(Context c, List<Package> pacs, PackageManager pm) {
mContext = c;
pacsForAdapter = pacs;
pmForListener = pm;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, final int pos, long arg3) {
Intent launchIntent = new Intent(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cp = new ComponentName(pacsForAdapter.get(pos).getPackageName(), pacsForAdapter.get(pos).getClassName());
launchIntent.setComponent(cp);
mContext.startActivity(launchIntent);
}
}
ОБНОВЛЕНИЕ : после проверки на Profiler, когда я касаюсь экрана и выбираю приложение, использование памяти увеличивается до 100 МБ за клик.