0

私は自分の問題を解決するために何百もの異なる方法を試してきましたが、何らかの理由で単純に機能しません。アプリケーションを永続的にするために、すばやく汚い方法を作ろうとしています。基本的に、破棄するときに保存する必要があるオブジェクトがたくさんあるので、オブジェクトをArrayListに入れ、ObjectOutputStreamを使用してArrayListをファイルに書き込むようにすると思いました。

public void onStop() {
    super.onStop();
    Log.d("Event", "Stopped");
    FileOutputStream fos = null;
    ObjectOutputStream oos = null;
    try {
        fos = openFileOutput("Flights", MODE_WORLD_WRITEABLE);
        oos = new ObjectOutputStream(fos);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    ArrayList<Flight> alFlightList = new ArrayList<Flight>();
    Iterator it = flightMap.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        alFlightList.add((Flight) pairs.getValue());
    }
    try {
        oos.writeObject(alFlightList);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        Log.d("Info", "File created!");
    }      
}

再度読み取るための同様のアルゴリズムを取得しましたが、読み取るファイルがないと文句を言います。永続化のためにファイルを使用することがベスト プラクティスではないことはわかっていますが、これは前述のとおり、迅速で汚い解決策であるはずです。(しかし、私が今使っている時間は、データベースの作成に費やされた可能性があります.._.) ありがとう!

4

3 に答える 3

1

Saving Persistent Stateに関するドキュメントから、

通常、アクティビティが処理する永続的な状態には、共有ドキュメントのようなデータ (通常はコンテンツ プロバイダーを使用して SQLite データベースに格納される) と、ユーザー設定などの内部状態の 2 種類があります。

コンテンツ プロバイダーのデータについては、アクティビティで「その場で編集」ユーザー モデルを使用することをお勧めします。つまり、ユーザーが行った編集は、追加の確認手順を必要とせずにすぐに効果的に行われます。このモデルをサポートすることは、通常、次の 2 つのルールに従うという単純な問題です。

新しいドキュメントを作成すると、そのバッキング データベース エントリまたはファイルがすぐに作成されます。たとえば、ユーザーが新しい電子メールを作成することを選択した場合、データの入力を開始するとすぐにその電子メールの新しいエントリが作成されるため、その時点以降に他のアクティビティに移動すると、この電子メールは次のようになります。ドラフトのリストに表示されるようになりました。アクティビティの onPause() メソッドが呼び出されると、バッキング コンテンツ プロバイダーにコミットするか、ユーザーが行ったすべての変更をファイルする必要があります。これにより、これらの変更は、実行しようとしている他のすべてのアクティビティで確実に認識されます。アクティビティのライフサイクル中の重要な時期に、データをさらに積極的にコミットすることをお勧めします。たとえば、新しいアクティビティを開始する前、独自のアクティビティを終了する前、ユーザーが入力フィールドを切り替えるときなどです。

したがって、「正しく」実行したい場合は、データをonPause...に保存します。おそらく、何らかのSQLiteデータベースを使用して状態を保存します。また、 を使用して別のスレッドでファイル I/O を実行する必要がありますAsyncTask。この種のことは、UI スレッドをブロックしてアプリをクラッシュさせる可能性があるためです。

手っ取り早く汚い方法が必要な場合 (つまり、このアプリケーションを Android マーケットでリリースしない場合)、問題は でファイル I/O を実行しようとしていることにあると思いますがonDestroy、これはそうではありません。呼び出されることが保証されています。これは、 でファイルの読み取り/書き込みを実行するもう 1 つの理由ですonPause

最後に、内部/外部ストレージに関するドキュメントを読むことをお勧めします。ファイルのアクセス許可がないため、正しいディレクトリに書き込んでいない可能性があります。次のようにファイル I/O を実行する必要があります。

String FILENAME = "FLIGHTS";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(...);
fos.close();
于 2012-06-24T15:53:44.193 に答える
0

データベースを使ってみませんか?アプリの作成時または再起動時に、データベースからすべての設定をコールバックしますか?

onpause()またはonstop()メソッドを使用して、すべてのデータをデータベースに格納することもできます。

于 2012-06-24T17:26:24.330 に答える
0

/sdcard/Flights の Flight を置き換えるか、null スペースにファイルを作成します。:)うまくいくかどうかはわかりません。

于 2012-06-24T15:49:48.953 に答える