3

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

    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 和 getInstalledPackages() 失败PackageManager.getInstalledPackages() 返回空列表Android 中 UI 线程操作期间显示 ProgressDialog我想明白他们在说什么,但我在理解如何让它发挥作用时遇到了问题。我知道延迟来自 List list = pm.getInstalledApplications(PackageManager.GET_META_DATA); 我知道 getInstalledApplications(PackageManager.GET_META_DATA); 必须在主 UI 上运行,否则应用程序强制关闭。我该如何保持 getInstalledApplications(PackageManager.GET_META_DATA); 它需要在哪里,但在后台填充列表,这样应用程序就不会被冻结?预先感谢您的任何帮助。

更新代码以显示 Asynctask。我让代码在异步中运行,但现在它只在文本视图中显示一个结果而不是列表。我知道它必须是一些我缺少的简单的东西才能让它工作。

4

1 回答 1

2

我会修改你的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 += ...);

于 2013-01-10T20:40:58.040 回答