2

さまざまな場合に画面に表示される一連の小さな画像 (約 200 画像) (合計サイズ ~ 10MB) が付属するアプリがあります。ユーザーが何らかのボタンを押すと、これらの画像の 1 つが表示されます (いずれかの画像である可能性があります)。今後いつでも画像が追加される可能性があるため、アプリはサーバー上の xml ドキュメントをチェックします (チェックが最後に行われてから 24 時間以上経過している場合、このチェックはメイン アクティビティの onCreate() で行われます)。xml ドキュメントにはすべての画像が一覧表示されるため、ドキュメントが変更され、新しい画像が追加されたかどうかを簡単に確認できます。さらに画像が追加された場合、アプリはこれらの画像をサーバーからダウンロードし、デバイスに既に存在する画像と共に保存する必要があります。

私が最初に考えたのは、10MB の画像をアプリにバンドルしてアセット フォルダーに配置し、アプリを初めて起動したときに画像をアセット フォルダーから内部ストレージに移動することでした。その後、将来さらに画像が追加される場合は、それらもダウンロードされて内部ストレージに保存されるため、すべての画像がうまくまとめられていましたが、少し実験した後、多くの時間がかかることがわかりました。デバイスの時間 (Android 4.1 を搭載した HTC One S でのテスト) は、アセット フォルダー内の画像を一覧表示するだけで (1 分以上)、実際にそれらをコピーすることは気にしません。ユーザーが最初にアプリを体験するのに 1 分以上の待ち時間がかかることを望んでいないため、これは受け入れられません。

AssetManager クラスの list(String path) メソッドを使用してファイルを一覧表示しています。

だから私は私の質問は次のとおりだと思います:

ユーザーが最初の起動時に長時間待つ必要がなく、アプリがその場でより多くの画像をダウンロードできるように、これをどのように実装しますか?

4

1 に答える 1

3

同様のシナリオがあります。すべてのファイルを 1 つの zip に圧縮し、res/raw フォルダーに保存しました。次に、最初の起動時に、すべてのファイルをアプリの内部ストレージに抽出します。

public static void unzipFiles(Context context, int file) {
    InputStream stream;

    context.getFilesDir().mkdirs();
    String path = context.getFilesDir().getAbsolutePath();

    try {
        stream = context.getResources().openRawResource(file);
        if (stream == null) {
            throw new RuntimeException("Cannot load " + file + " file from raw folder");
        }

        ZipInputStream zis = new ZipInputStream(stream);
        ZipEntry entry;

        while ((entry = zis.getNextEntry()) != null) {
            if (entry.isDirectory()) {
                File f = new File(path, entry.getName());
                if (!f.exists()) {
                    f.mkdirs();
                }
            } else {
                int size;
                byte[] buffer = new byte[2048];

                File f = new File(path, entry.getName());
                FileOutputStream fos = new FileOutputStream(f);
                BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length);

                while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
                    bos.write(buffer, 0, size);
                }
                bos.flush();
                bos.close();
            }
        }

    } catch (IOException e) {
        throw new RuntimeException("Cannot unzip '" + file + "'", e);
    }

}
于 2013-06-20T17:27:03.480 に答える