0

最初はJavaの知識が豊富ですが、Androidから始めたばかりです。

私のAndroidアプリは、カスタムオブジェクトに保存しているかなり複雑なデータ(テキスト、日付、画像)をダウンロードしています。データは時々更新する必要があります。ただし、通常、ダウンロードされたデータは変更されません。

データをメモリに保持するために、アプリケーションオブジェクトを使用しています。残念ながら、アプリが強制終了されると、アプリケーションオブジェクトインスタンスが破棄されるようです。

したがって、onPause()中に、カスタムオブジェクト(アプリケーションオブジェクトに含まれている)をシリアル化して内部ストレージに保存するのが良い方法かどうか疑問に思いました。明らかに、インターネットからリロードする前に、まずonResume()でファイルから読み取ります。アイデアは、オフライン表示を有効にすることでもあります。

長期的には、バックグラウンドサービスで日付をダウンロードするコードを移動する計画です。Androidでアプリケーションの状態を維持するにはさまざまな方法があるようですので、これが正しい方法であることを確認したいと思います。

4

1 に答える 1

1

これらのメソッドクラスを使用して、必要なオブジェクト(シリアル化を実装)を保存してみてください。

public synchronized boolean save(String fileName, Object objToSave)
    {
        try
        {

            // save to file
            File file = new File(CONTEXT.getDir("filesdir", Context.MODE_PRIVATE) + "/file.file");
            if (file.exists())
            {
                file.delete();
            }

            file.getParentFile().mkdirs();
            file.createNewFile();

            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(objToSave);
            oos.close();

            return true;
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
            return false;
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return false;
        }
    }


public synchronized Object load(String fileName)
    {
        try
        {

            File file = new File(CONTEXT.getDir("filesdir", Context.MODE_PRIVATE) + "/file.file");
            if (!file.exists())
            {
                return null;
            }

            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
            savedObj = ois.readObject();
            ois.close();

            return savedObj;
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
            return null;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

load()するオブジェクトをキャストする必要があります。CONTEXTは、cachedirへのアクセスを取得するためのActivityまたはApplicationContextです。代わりにEnvironment.getExternalStorageState()を使用してディレクトリパスを取得できます。「/filename」を追加することを忘れないでください。

于 2012-09-25T16:54:23.970 に答える