0

ListView に画像のサムネイルを表示しようとしています。画像は SD カードの Camera フォルダにあります。BitmapFactory.decodeFile を使用して画像を読み込んでいます。ファイルのデコード中に ProgressDialog を表示したいと思います。最初に ProgressDialog を表示してから、for ループで decodeFile を呼び出そうとしています。ProgressDialog は、for ループの後まで表示されません。ProgressDialog が表示される前に、decodeFile の呼び出しが実行されているように見えます。

for ループの前に ProgressDialog を表示するにはどうすればよいですか?

public class ActivityProgressBar extends ListActivity {

private Vector<RowFileData> fileDataDisplay = null;     
RowFileData fileData;
ProgressDialog progressDialog = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list);        
    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading thumbnails...");
    fileDataDisplay = new Vector<RowFileData>();
    File currentDirectory = new File("/mnt/sdcard/dcim/camera");
    File[] currentDirectoryFileList = currentDirectory.listFiles();
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = 16;
    progressDialog.show();
    for(int i=0; i<currentDirectoryFileList.length; i++)
    {
        File currentDirectoryFile = currentDirectoryFileList[i];
        fileData = new RowFileData(BitmapFactory.decodeFile(currentDirectoryFile.getPath(), opts), currentDirectoryFile.getPath());
        fileDataDisplay.add(fileData);
        Log.v("myLog", "inside for loop");
    }
}   

private class RowFileData 
{
   protected Bitmap rowBitmap;
   protected String rowFileName;
   RowFileData(Bitmap bitmapPreview, String fileName)
   {
       rowBitmap = bitmapPreview;
       rowFileName = fileName;
   }
}

}

for ループの後に ProgressDialog が表示されていることを確認するために、progressDialog.dismiss() の呼び出しをコメントアウトしました。読みやすくするために、ListView に画像を表示するコード行を削除しました。ログを使用して、まだ for ループにいることを確認しました。

ありがとう

4

3 に答える 3

1

バックグラウンドでビットマップをデコードし、進行状況ダイアログを前面に表示するために asynctask を使用することもできます。ビットマップのデコードが完了したら、進行状況ダイアログを無効にします。Android - AsyncTaskチュートリアルが役に立ちます。サンクス。

于 2011-08-26T18:43:53.123 に答える
1

画像の遅延読み込みを検討することをお勧めします。別の SO 投稿に素晴らしい例があります。これはまさにこの目的のために実装したばかりで、うまく機能します。

ListView での画像の遅延読み込み

于 2011-08-26T18:25:10.627 に答える
0

ビットマップファイルがデコードされている間、進行状況ダイアログが表示され、表示されたままになることを望んでいました。また、Android のメイン スレッドが UI スレッドであり、メイン スレッドで処理が行われている間は UI がフリーズしていることに気付きませんでした。バックグラウンド スレッドを使用したところ、進行状況ダイアログが正しく表示されるようになりました。

public class ActivityProgressBar extends ListActivity {

private Vector<RowFileData> fileDataDisplay = null;     
RowFileData fileData;
ProgressDialog progressDialog = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list);        
    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading thumbnails...");
    fileDataDisplay = new Vector<RowFileData>();
    File currentDirectory = new File("/mnt/sdcard/dcim/camera");
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = 16;
    File[] currentDirectoryFileList = currentDirectory.listFiles();
    progressDialog.show();
    readThumbnails(currentDirectoryFileList, opts);
}   

private void readThumbnails(final File[] currentDirectoryFileList, final BitmapFactory.Options opts) 
{
    Thread backgroundThread = new Thread()
    {
        public void run()
        {
            try
            {
                for(int i=0; i<currentDirectoryFileList.length; i++)
                {
                    File currentDirectoryFile = currentDirectoryFileList[i];
                    fileData = new RowFileData(BitmapFactory.decodeFile(currentDirectoryFile.getPath(), opts), currentDirectoryFile.getPath());
                    fileDataDisplay.add(fileData);
                    Log.v("myLog", "inside for loop");
                }
                uiCallback.sendEmptyMessage(0);
            }
            catch(Exception ex)
            {
                Log.v("myLog", ex.toString());
            }
        }
    };
    backgroundThread.start();
}

private Handler uiCallback = new Handler()
{
    @Override
    public void handleMessage(Message emptyMessage)
    {
        progressDialog.dismiss();
    }
};

private class RowFileData 
{
   protected Bitmap rowBitmap;
   protected String rowFileName;
   RowFileData(Bitmap bitmapPreview, String fileName)
   {
       rowBitmap = bitmapPreview;
       rowFileName = fileName;
   }
}

}

于 2011-08-30T21:43:13.620 に答える