Android BitmapFactory decodeFile вызывается раньше, чем должно быть - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь отобразить эскизы изображений в ListView.Изображения находятся в папке Camera на моей SDCard.Я использую BitmapFactory.decodeFile для чтения изображений.Я хотел бы отобразить ProgressDialog во время декодирования файлов.Я пытаюсь сначала показать ProgressDialog, а затем вызвать decodeFile в цикле for.ProgressDialog не отображается до окончания цикла for.Вызов decodeFile, по-видимому, выполняется до отображения ProgressDialog.

Как отобразить ProgressDialog перед циклом for?

открытый класс ActivityProgressBar расширяет 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;
   }
}

}

Я прокомментировалвызов метода progressDialog.dismiss () для проверки того, что ProgressDialog показывается после цикла for.Я удалил строки кода для отображения изображений в ListView для удобства чтения.Я подтвердил, что все еще был в цикле for с моим Журналом.

Спасибо

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Вы также можете использовать asynctask для декодирования растрового изображения в фоновом режиме и отображения диалогового окна прогресса впереди.После завершения декодирования растрового изображения просто отключите диалог прогресса. Android - AsyncTask и Учебное пособие поможет вам.Thnx.

1 голос
/ 26 августа 2011

Я бы посоветовал заглянуть в Ленивый Загрузка ваших изображений.В другом посте SO есть отличный пример, который я только что реализовал для этой конкретной цели, и он прекрасно работает.

Ленивая загрузка изображений в ListView

0 голосов
/ 31 августа 2011

Я надеялся, что диалоговое окно прогресса будет отображаться и оставаться отображенным во время декодирования растровых файлов.Кроме того, я не осознавал, что основным потоком в Android является поток пользовательского интерфейса, и пользовательский интерфейс заморожен, а обработка происходит в основном потоке!Я использовал фоновый поток, и теперь диалоговое окно прогресса отображается правильно:

открытый класс 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;
   }
}

}

...