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にある限り正常に機能しますが、読み込み時にアプリが遅れる原因になります。私はこれらの3つの質問を読みました: AsyncTaskとgetInstalledPackages()が失敗しPackageManager.getInstalledPackages()が空のリストを返しAndroidでのUIスレッド操作中にProgressDialogを表示します彼らが何を言っているのかは理解できていると思いますが、それを機能させる方法を理解するのに問題があります。遅延はリストリスト=pm.getInstalledApplications(PackageManager.GET_META_DATA);から来ていることを知っています。そして私はgetInstalledApplications(PackageManager.GET_META_DATA);を知っています。メインUIで実行する必要があります。そうしないと、アプリが強制終了します。getInstalledApplications(PackageManager.GET_META_DATA);を維持するにはどうすればよいですか。必要な場所ですが、アプリがフリーズしているように見えないように、バックグラウンドでリストにデータを入力しますか?よろしくお願いします。

Asynctaskを表示するようにコードを更新しました。非同期で実行するコードを取得しましたが、リストではなく、テキストビューに1つの結果しか表示されなくなりました。私はそれを機能させるために私が欠けていることは何か単純なことでなければならないことを知っています。

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 に答える