2

私のフラッシュアプ​​リでは、ネイティブのAndroid Java呼び出しである「ネイティブ拡張」を作成する必要がありました。この拡張機能は、すべての画像ファイルとそれに対応するサムネイルで構成される文字列を作成し、それを Flash に返します。

私は Java プログラマーではありません。Android コードを書くのはこれが初めての試みです。それで、2日間掘り下げた後、私はこれを思いつきました:

public String getThumbPaths(Uri uri, ThumbContext ctx) {
    String out = "";
    Cursor cursor = MediaStore.Images.Thumbnails.queryMiniThumbnails(ctx
            .getActivity().getContentResolver(), uri,
            MediaStore.Images.Thumbnails.MINI_KIND, null);


    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

        String imageId = cursor.getString(cursor
                .getColumnIndex(Thumbnails.IMAGE_ID));

        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor images = ctx.getActivity().managedQuery(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                filePathColumn, MediaStore.Images.Media._ID + "=?",
                new String[] { imageId }, null);

        String filePath = "";

        if (images != null && images.moveToFirst()) {
            filePath = images.getString(images.getColumnIndex(filePathColumn[0]));
        }

        out += cursor.getString(1) + ";" + filePath+";";

    }

    return out;
}

そして呼び出し

ThumbContext ctx = (ThumbContext) context;
Uri uri = MediaStore.Images.Thumbnails.getContentUri("external"); // content://media/external/images/thumbnails
String paths = getThumbPaths(uri, ctx);

速度を除いて、すべてがうまく機能します。これが Flash-Java-Flash 呼び出しによるものか、上記のコードの一部によるものかはわかりませんが、コンパイルは Flash 内で行われるため確認できません。

だから私の質問は: このコードを高速化できますか? 「for」ループ内で2番目のカーソルなしでこれを行うでしょうか?

4

1 に答える 1

0

あなたができるいくつかの小さな最適化があります。

  1. cursor.getColumnIndex(Thumbnails.IMAGE_ID)カーソルを通るすべての反復に対して同じ値を返します。ループ外の変数に割り当てます。
  2. String[] filePathColumnすべての反復で同じ値が割り当てられます (また、すべての反復で新しいオブジェクトも作成されます)。ループの外に移動します。
  3. innerCursorの場合、 はMediaStore.Images.Media._ID + "=?"常に同じ値を持ちます。ループの外:)
  4. として作成outしてStringそれに追加する代わりに、java.lang.StringBuilder代わりに使用することを検討してください。
于 2012-11-15T15:06:26.313 に答える