getInstalledApplications

getInstalledApplications

我正在获取要显示给用户的已安装非系统应用程序列表,我正在使用它来执行此操作:

    private class getApplications extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        // perform long running operation operation

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

            if ((list.get(i).flags & ApplicationInfo.FLAG_SYSTEM) != 1) {

                label = (String) pm.getApplicationLabel(list.get(i));

                Log.w("Installed Applications", list.get(i).packageName.toString());

            }
        }

        return label;
    }

    @Override
    protected void onPostExecute(String result) {

        txtApplications.append(label);

        if (i!=list.size()-1) {

             txtApplications.append(", ");

           }
    }

    @Override
    protected void onPreExecute() {

        pm = getPackageManager();

        list = pm.getInstalledApplications(PackageManager.GET_META_DATA);

    }

};

只要它在主 UI 上就可以正常工作,但它会导致应用程序在加载时滞后。我已经阅读了这三个问题: AsyncTask and getInstalledPackages() failPackageManager.getInstalledPackages() returns empty listShowing ProgressDialog during UI Thread operation in Android 并且我认为理解他们在说什么,但我在理解如何使其工作时遇到问题。我知道延迟来自 List list = pm.getInstalledApplications(PackageManager.GET_META_DATA);我知道 getInstalledApplications(PackageManager.GET_META_DATA);必须在主 UI 上运行,否则应用程序强制关闭。我如何继续保持 getInstalledApplications(PackageManager.GET_META_DATA);它需要在哪里,但在后台填充列表,这样应用程序就不会被卡住?预先感谢您的任何帮助。

更新代码以显示 Asynctask。我让代码在异步中运行,但现在它只在文本 View 而不是列表中显示一个结果。我知道它必须是一些简单的东西,我想让它发挥作用。

最佳答案

我会修改您的 doInBackground() 使其看起来像这样:

@Override
protected String doInBackground(String... params) {
    // perform long running operation operation

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

        if ((list.get(i).flags & ApplicationInfo.FLAG_SYSTEM) != 1) {

            //add all the application names to the same String.
            label +=", " + (String) pm.getApplicationLabel(list.get(i));


            Log.w("Installed Applications", list.get(i).packageName.toString());

        }
    }

    return label;
}

因此,我想说您的 onPostExecute() 需要看起来像:
    @Override
    protected void onPostExecute(String result) {

        txtApplications.append(label);

           }
    }

从现在开始, label 包含所有应用程序名称(因为 label += ... );

关于android - getInstalledApplications() 与 asynctask,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14227552/

10-12 01:51