Как выполнить другие потоки из doinbackground()

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

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

1 ответ

Я согласен с комментарием, сделанным 323go

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

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

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

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

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

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

URL считается ключом. Изображение кэшируется в память SDCard или телефона. Расположение для кэша может быть указано. Если изображение существует в кеше. отображать изображения из кэша, если не скачать, кэшировать и отображать изображения.

Оба используют кеширование. Universal 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

Другие вопросы по тегам