Как выполнить другие потоки из 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