Пользовательская панель запуска приложений, пропускающая рамку при открытии системных приложений - PullRequest
0 голосов
/ 03 мая 2019

Я создал собственный модуль запуска, и когда я захожу в системный ящик приложений (я использовал 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 МБ за клик.

...