質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Java

    15560questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7181questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4222questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

GridViewで写真が呼び出し完了した物から順番に表示されるようにしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 520

SmartBuzz

score 73

アルバムアプリを作成しています。
ストレージファイルから画像ファイルのパスを探してきて表示するまでに、2~3秒の時間がかかってしまい、固まってるんじゃないか?と不安になってしまう、UIになっています。

これを解消する為に、読み出された画像を随時GridViewに表示していくようにしたいのですが、今の仕様だと全て読み出しが完了した時にGridViewに画像が反映するような仕様になっています。

どのようにすれば、随時表示できるような仕様になるのでしょうか?

【AlbumActivity.java】

    private void update(final Activity activity){

         new Thread(new Runnable() {
            @Override
            public void run() {
                // 全てのデータから画像データのパスを取得する
                final List<String> filePathListAll = getPicturePath();
                // 表示する必要がある写真のパスを入れたリスト
                final List<String[]> filePathList = new ArrayList<>();
                // 取得した先の写真を選別する
                for (String filePath:filePathListAll) {
                    try {
                        ExifInterface exif = new ExifInterface(filePath);
                        if(exif.getAttribute(ExifInterface.TAG_DATETIME) != null) {
                            setAdapterFile(activity,filePathList,exif,filePath);
                        }
                    }catch (Exception e){
                    }
                }
                filePathListAll.clear();
            }
        }).start();
    }

   private void setAdapterFile(final Activity activity, final List<String[]> pathDatas, final ExifInterface exif, final String filePath){

        final List<String[]> pathData = pathDatas;

        new Thread(new Runnable() {
            @Override
            public void run() {

                // 撮影日時を取得して、該当するものだけパスをリストに入れる
                if (boolDate(exif.getAttribute(ExifInterface.TAG_DATETIME))) {
                    String[]pathDataArray = {filePath ,  getTAG_DATETIME(exif) };
                    pathData.add(pathDataArray);
                }else{
                    return;
                }
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        GridView gridView = (GridView) findViewById(R.id.gridView);
                        final AlbumAdapter adapter = new AlbumAdapter(context, pathData);
                        gridView.setAdapter(adapter);
                        ImageView imageView = (ImageView)findViewById(R.id.non_picture);
                        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                Intent intent = new Intent(context, PhotoActivity.class);
                                intent.putExtra(PhotoActivity.EXTRA_PHOTO, (String) adapter.getItem(position));
                                startActivity(intent);
                            }
                        });
                    }
                });
            }
        }).start();
    }

【AlbumAdapter.java」

    public AlbumAdapter(Context context, List<String[]> pathData) {
        // コンテントリゾルバを取得し、外部メディアの画像を取得する
        mContext = context;
        layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.pathData = pathData;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder;

        if(convertView == null){
            convertView = layoutInflater.inflate(R.layout.content_album, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder)convertView.getTag();
        }

        Bitmap thumbnail = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(pathData.get(position)[0], options);
        /** 横の縮尺を求める */
        int scaleW = options.outWidth / THUMBNAIL_WIDTH + 1;
        /** 縦の縮尺を求める */
        int scaleH = options.outHeight / THUMBNAIL_HEIGHT + 1;

        int scale = Math.max(scaleW, scaleH);
        options.inJustDecodeBounds = false;
        options.inSampleSize = scale;
        thumbnail = BitmapFactory.decodeFile(pathData.get(position)[FILEPATH], options);

        viewHolder.photo.setImageBitmap(thumbnail);
        viewHolder.time.setText(pathData.get(position)[DATE]);

        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        convertView.setMinimumWidth(800);

        return convertView;
    }

    private class ViewHolder{
        FrameLayout container;
        TextView time;
        ImageView photo;

        public ViewHolder(View v){
            container = (FrameLayout)v.findViewById(R.id.content_album);
            time = (TextView)v.findViewById(R.id.timeText);
            photo = (ImageView)v.findViewById(R.id.photoImage);
        }
    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

AsyncTaskクラスを継承したクラスを作って解決した。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

具体的に時間がかかっている箇所を探さないと並列処理を組み込んでも無駄に終わりますよ。
各処理の開始と終わりにログ出力して時間を計測すべきです。

また、setAdapterFileをfor文の中で呼んでいる意味はなんでしょうか?
for文が終わった後に呼べばいいように見えます。これが時間がかかっているのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/24 09:09

    >各処理の開始と終わりにログ出力して時間を計測すべきです。
    なるほど…。そういう分析方法があるんですね…。やってみます。

    setAdapterFileは、全てのリストを作り終わる前に、リストに入れるものが1つできる度に呼び出した方が順番に表示されるのかな?と思い、毎回呼ぶようにしています。

    キャンセル

同じタグがついた質問を見る

  • Java

    15560questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7181questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4222questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。