0

起動時に実行される非同期タスクがあります。

public class BufferApps extends AsyncTask<String, Void, ArrayList<PackageInfo>> {

PackageManager mPackageManager;
Context mContext;

public BufferApps(PackageManager pm, Context context){
    super();
    this.mPackageManager = pm;
    this.mContext = context;
}

    protected ArrayList<PackageInfo> doInBackground(String... strings) {

        //this code works, not where the problem is

        return installedApps;
    }

    protected void onPostExecute(ArrayList<PackageInfo> installedApps) {

        ?

        Toast.makeText(mContext, "Finished!", Toast.LENGTH_SHORT).show();
    }
}

基本的にここで起こっていることは、オブジェクトの ArrayList 、特にユーザーがデバイスにインストールしたすべてのアプリのリストを作成していることです。ここで空白を描いているだけだと思いますが、これをしばらく試してみましたが、installedAppsよくわかりません。 onPostExecute に渡す I は問題ないようです。installedAppsそれが上記のリストだとしましょう。

私が望むのは、このリストをどこかに保存して、デバイスにインストールされているアプリのリストが必要なときに、インストールされているアプリをロードするという面倒な作業をすべて行うことなく、すぐにアクセスできるようにすることです (doInBackground のコードにはかなりの時間がかかります)。実行時間)。これどうやってするの?

SharedPreference と組み合わせて gson シリアライゼーションを試みましたが、何らかの理由でエラーが発生しました。これらのエントリを含むArrayList オブジェクトを 1 つだけ使用して別のクラスを作成しようとしましたstaticが、これも失敗したようです。必要に応じて試してみることもできますが、他のすべてのアクティビティから簡単にアクセスできるように ArrayList を格納するための良い方法を誰かが推奨できる場合は、それが最も役に立ちます。

4

1 に答える 1

1

アプリケーションクラスに保存します。つまり、を拡張Applicationし、そのクラスをマニフェストに割り当てます。

  <application
      android:name=".MyApplication"

このようにアプリケーションクラスを実装し、

public class MyApplication extends Application {

  private final List<App> apps = new ArrayList<App>();

  public void setApps(List<App> apps) {
    this.apps = apps;
  }

  public List<App> getApps() {
    return apps;
  }
}

あなたのonPostExecute()、電話で、

((MyApplication)getApplication()).setApps(apps);

他のコンポーネントからアプリが必要なときはいつでも、電話して、

List<App> apps = ((MyApplication)getApplication()).getApps();

アプリの一覧がまだ利用できない場合に行うことの複雑さを考慮する必要があります。そのために、あなたはできる

  1. 独自のコールバック インターフェイスを作成します。たとえば、呼び出しgetApps()て戻り結果を取得する代わりにgetApps()、コールバックを呼び出して渡します。thenの実装はgetApps()、コールバックがある場合はすぐに呼び出すか、 を開始してAsyncTaskでコールバックを呼び出しますonPostExecute()

  2. getApps()利用できない場合はnull を返すだけで、 AsyncTask. タスクが終了したら、アプリが利用可能になったことを示すインテントをブロードキャストします。関心のある呼び出し元は、インテントに登録して適切に処理する必要があります。

于 2013-08-01T15:57:42.143 に答える