2013-04-01 3 views
0

Я хочу загрузить несколько изображений с помощью ImageLoader.loadImage, который запустит несколько потоков. Поскольку они требуют времени для выполнения, и я не хочу блокировать пользовательский интерфейс, я хочу запустить их в функции doInBackground() AsyncTask.Как выполнить другие потоки из doinbackground()

Однако я не могу запускать новые потоки в функции doInBackground(). Есть ли способ обойти это?

+0

Почему бы вам не запустить новые потоки? Любые ошибки? – Goddchen

+3

Возможно, вам захочется немного узнать о Threads и AsyncTask.Вы правы в том, что хотите использовать AsyncTask, чтобы не блокировать пользовательский интерфейс - с Android 4.x, который на самом деле является ТРЕБОВАНИЕМ, и ваше приложение выйдет из строя, если вы попытаетесь получить доступ к интернету в потоке пользовательского интерфейса. Все идет нормально. Поскольку 'doInBackground' уже убегает от потока пользовательского интерфейса, нет никакой причины отталкивать дополнительные потоки. Если вы хотите запускать несколько потоков для одновременного запуска нескольких загрузок, вам не нужен AsyncTask ... – 323go

+0

@ Jake проверить отредактированный ответ. Когда у вас есть URL-адреса, вы можете отображать изображения в виде списка или gridview без блокировки пользовательского интерфейса с помощью универсального загрузчика изображений. – Raghunandan

ответ

1

Я согласен с замечанием 323go

AsyncTask разработан, чтобы быть вспомогательным классом вокруг Thread и обработчиком и не представляет собой общие рамки многопоточности. AsyncTasks идеально подходит для коротких операций (не более нескольких секунд). Если вам нужно поддерживать потоки в течение длительных периодов времени, настоятельно рекомендуется использовать различные API, предоставляемые java.util.concurrent pacakge таких как Исполнитель, ThreadPoolExecutor и FutureTask. (Прямо из документа)

В качестве альтернативы вы можете использовать https://github.com/octo-online/robospice. Вы можете сделать несколько запросов spice.

Универсальный погрузчик Изображение

Чтобы загрузить и отобразить большое количество изображений, используйте представление списка или сетки. Для этого вы можете использовать Universal Image Loader или Lazy list. Универсальный загрузчик изображений работает по принципу выборки как ленивый список.

Мне пришлось отображать изображения из общей папки альбома picasa (около 300 - 500). Я сделал http-запрос, и ответ был json. Я использовал asynctask для отправки HTTP-запроса, получения ответа, parse json для получения URL-адресов. Как только я получил url, я использовал Universal Image Loader для загрузки изображений. Таким образом, вы можете использовать asynctask для короткой работы.

Предположим, вы сможете просматривать 3 изображения за раз в списке. Три изображения загружаются, кешируются, если их нет и отображаются. При прокрутке процедуры повторы. Как только кешированные изображения не нужно загружать снова. Пользовательский интерфейс в этом случае не блокируется. Вы можете прокручивать вниз в любое время.

Адрес считается ключевым. Изображение кэшируется в SD-карте или в памяти телефона. Можно указать местоположение для кеша. Если изображение существует в кеше. отображать изображения из кеша, если не загружать, кешировать и отображать изображения.

Оба используют кеширование. Универсальный Image Loader имеет множество опций конфигурации. https://github.com/nostra13/Android-Universal-Image-Loader

Посмотрите на особенности в ссылке.

В пользовательском адаптере конструктор

File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder"); 

// Get singletone instance of ImageLoader 
imageLoader = ImageLoader.getInstance(); 
// Create configuration for ImageLoader (all options are optional) 
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a) 
     // You can pass your own memory cache implementation 
    .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation 
    .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) 
    .enableLogging() 
    .build(); 
    // Initialize ImageLoader with created configuration. Do it once. 
    imageLoader.init(config); 
    options = new DisplayImageOptions.Builder() 
    .showStubImage(R.drawable.stub_id)//display stub image 
    .cacheInMemory() 
    .cacheOnDisc() 
    .displayer(new RoundedBitmapDisplayer(20)) 
    .build(); 

В вашем GetView()

ImageView image=(ImageView)vi.findViewById(R.id.imageview); 
    imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options 

Вы можете настроить другие параметры в соответствии с вашими потребностями.

Вы должны использовать зритель для плавной прокрутки и производительности. http://developer.android.com/training/improving-layouts/smooth-scrolling.html

Смежные вопросы