Загрузка изображений из веб-каталога, отображение в ImageView - PullRequest
0 голосов
/ 06 октября 2011

Я пытаюсь написать простое приложение, которое загружает изображения, которые хранятся в веб-каталоге, который я создал. Я хочу, чтобы приложение захватило ВСЕ изображения, хранящиеся в указанном каталоге, и отобразило их в макете.

Приведенный ниже код работает только для определенных типов URL-адресов (главным образом tinypic, но не для Photobucket, imageshack и т. Д.), А также не для каталогов.

Мои имена изображений отформатированы в такой последовательности, как image1.png, image2.png и т. Д., Чтобы фрагмент кода и метод downloadFile() работали.

Но я не уверен, как бы я мог получить все изображения с сервера одновременно, потому что он захватывает только одно изображение за раз, устанавливает его как растровое изображение и затем отображает его в IV. Я довольно новичок в Android, поэтому будет полезна помощь в правильном направлении.

public class NewWallpapersActivity extends Activity {

    ImageView imView1;
    String imageUrl="http://i133.photobucket.com/albums/q44/slimjady/Wallpapers";
    Random r= new Random();

    /** Called when the activity is first created. */ 
    @Override
    public void onCreate(Bundle SavedInstanceState) {
        super.onCreate(SavedInstanceState);
        setContentView(R.layout.newwallpapers);

        Button bt3= (Button)findViewById(R.id.get_imagebt);
        bt3.setOnClickListener(getImgListener);
        imView1 = (ImageView)findViewById(R.id.IV1);
    }    

    View.OnClickListener getImgListener = new View.OnClickListener(){

        public void onClick(View view) {
            //i tried to randomize the file download, in my server i put 4 files with name like
            //png0.png, png1.png, png2.png so different file is downloaded in button press
            int i =r.nextInt(4);
            downloadFile(imageUrl+"png"+i+".png");
            Log.i("im url",imageUrl+"png"+i+".png");
        }

    };

    Bitmap bmImg;

    void downloadFile(String fileUrl){
        URL myFileUrl = null;          
        try {
            myFileUrl= new URL(fileUrl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();

            bmImg = BitmapFactory.decodeStream(is);
            imView1.setImageBitmap(bmImg);
        } catch (IOException e) {
            String exception = "Erro: An Exception Was Thrown";
            Toast errortoast = Toast.makeText(this, exception, Toast.LENGTH_SHORT);
            errortoast.show();
            e.printStackTrace();
        }
    }

}

1 Ответ

2 голосов
/ 06 октября 2011

Вот несколько мыслей по этому поводу:

Отображение всех изображений

Поскольку вы хотите отображать все изображения из одной папки, я бы предложил вам иметь Directory -активность, которая отображает все изображения в данном каталоге, и одну Image -активность, которая отображает только одну изображение.

Чтобы правильно представить это, я бы предложил , используя GridView, чтобы отобразить все изображения, и обычную активность в полноэкранном режиме ImageView, чтобы отобразить одно изображение.

Вы также можете использовать Gallery -виджет , чтобы "объединить" обе эти идеи.

Не позволяет пользователю ждать

Одна из самых больших проблем вашего подхода заключается в том, что изображения загружаются в UI-Thread .

В зависимости от размера всего или одного изображения и доступной скорости соединения, загрузка изображения может занять некоторое время. Пока изображения загружаются, UI-поток будет ожидать возвращения вашего downloadStuff() -метода и пользовательский интерфейс будет зависать. Это может создать иллюзию, что ваше приложение только что рухнуло.

Итак, вы захотите выполнить загрузку в отдельном потоке. В Android есть удобная оболочка для этого, которая называется AsyncTask.

.

В качестве небольшого бонуса, чтобы показать вашему пользователю, что процесс может занять некоторое время, вы можете использовать ProgressDialog, чтобы проиллюстрировать это (в потоке пользовательского интерфейса).

Зная, что в каталоге

Теперь мы подошли к тому моменту, когда нам пришлось столкнуться с некоторыми ограничениями. Если вы хотите использовать Picture-Hosters, как те, которые вы перечислили выше, вам нужно проверить, предлагают ли они вам API (или что-то подобное), чтобы получить список изображений (или их URL) из определенного каталога / альбома ( поищите ссылку "API" на первой странице).

Если вы разместите изображения на своем собственном сервере, вы сможете создать небольшой PHP-скрипт (или любой другой язык сценариев / программ, который вы предпочитаете), который затем перечисляет все файлы изображений в каталоге и представляет их в виде простой для анализа способ ( JSON или XML ).

Это позволит вам получить список URL-адресов для файлов изображений, которые вы хотите отобразить.

...