tl; dr: реализует Runnable лучше. Тем не менее, оговорка важна
. В общем, я бы рекомендовал использовать что-то вроде Runnable
, а не Thread
, потому что это позволяет вам поддерживать вашу работу только в сочетании с вашим выбором параллелизма. Например, если вы используете Runnable
и позже решили, что на самом деле этого не требуется Thread
, вы можете просто вызвать threadA.run ().
Предостережение: здесь, Я категорически отвергаю использование необработанных потоков. Я предпочитаю использовать Callables и FutureTasks (Из javadoc: «Адаптивное асинхронное вычисление»). Интеграция тайм-аутов, правильная отмена и объединение потоков современной поддержки параллелизма для меня гораздо более полезны, чем груды необработанных потоков.
Последующие действия: существует конструктор FutureTask
, который позволяет использовать Runnables (если это то, что вам больше всего нравится), и по-прежнему пользоваться преимуществами современных инструментов параллелизма. Процитировать javadoc:
Если вам не нужен конкретный результат, подумайте об использовании конструкций формы:
Future> f = new FutureTask
Итак, если мы заменим их runnable
на ваш threadA
, мы получаем следующее:
new FutureTask
Другим вариантом, который позволяет вам оставаться ближе к Runnables, является ThreadPoolExecutor . Вы можете использовать метод execute для передачи в Runnable для выполнения «данной задачи в будущем».
Если вы хотите попробовать использовать пул потоков, вышеописанный фрагмент кода будет выглядеть примерно следующим образом (с использованием фабричного метода Executors.newCachedThreadPool () ):
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new ThreadA());
Да. Это должно работать на всех основных браузерах.
В моем случае было полезно добавить обратный вызов вашей функции для события onload:
function preloadImage(url, callback)
{
var img=new Image();
img.src=url;
img.onload = callback;
}
И затем обернуть его для случая массива URL-адресов для изображений, которые будут предварительно загружены с обратным вызовом на всех сделано: https://jsfiddle.net/4r0Luoy7/
function preloadImages(urls, allImagesLoadedCallback){
var loadedCounter = 0;
var toBeLoadedNumber = urls.length;
urls.forEach(function(url){
preloadImage(url, function(){
loadedCounter++;
console.log('Number of loaded images: ' + loadedCounter);
if(loadedCounter == toBeLoadedNumber){
allImagesLoadedCallback();
}
});
});
function preloadImage(url, anImageLoadedCallback){
var img = new Image();
img.src = url;
img.onload = anImageLoadedCallback;
}
}
// Let's call it:
preloadImages([
'//upload.wikimedia.org/wikipedia/commons/d/da/Internet2.jpg',
'//www.csee.umbc.edu/wp-content/uploads/2011/08/www.jpg'
], function(){
console.log('All images were loaded');
});
Попробуйте это, я думаю, что это лучше.
var images = [];
function preload() {
for (var i = 0; i < arguments.length; i++) {
images[i] = new Image();
images[i].src = preload.arguments[i];
}
}
//-- usage --//
preload(
"http://domain.tld/gallery/image-001.jpg",
"http://domain.tld/gallery/image-002.jpg",
"http://domain.tld/gallery/image-003.jpg"
)
Источник: http://perishablepress.com/3-ways-preload-images-css-javascript-ajax/
onload
или просто создавать изображения в памяти.
– Benny Schmidt
31 March 2016 в 15:35
for (var i = 0.....
– Mohammer
13 June 2016 в 23:37
var
– clintgh
14 June 2016 в 02:55
Я рекомендую использовать try / catch для предотвращения возможных проблем:
OOP:
var preloadImage = function (url) {
try {
var _img = new Image();
_img.src = url;
} catch (e) { }
}
Стандарт:
function preloadImage (url) {
try {
var _img = new Image();
_img.src = url;
} catch (e) { }
}
Кроме того, в то время как я люблю DOM, у старых глупых браузеров могут возникнуть проблемы с вами, используя DOM, поэтому избегайте его вообще ИМХО вопреки вкладу Свобоева. Image () имеет лучшую поддержку в старых браузерах.
Этот подход немного более сложный. Здесь вы сохраняете все предварительно загруженные изображения в контейнере, может быть div. И после того, как вы сможете показать изображения или перенести их в DOM в правильное положение.
function preloadImg(containerId, imgUrl, imageId) {
var i = document.createElement('img'); // or new Image()
i.id = imageId;
i.onload = function() {
var container = document.getElementById(containerId);
container.appendChild(this);
};
i.src = imgUrl;
}
Попробуйте здесь , я также добавил несколько комментариев
CSS2 Альтернатива: http://www.thecssninja.com/css/even-better-image-preloading-with-css2
body:after {
content: url(img01.jpg) url(img02.jpg) url(img03.jpg);
display: none;
}
CSS3 Альтернатива: https://perishablepress.com/preload-images-css3/ (плотина H / T Linh)
.preload-images {
display: none;
width: 0;
height: 0;
background: url(img01.jpg),
url(img02.jpg),
url(img03.jpg);
}
ПРИМЕЧАНИЕ. Изображения в контейнере с display:none
могут не предустановить , Возможно, видимость: скрытые будут работать лучше, но я не проверял это. Спасибо Marco Del Valle за указание на это
display: none
не будут предварительно загружены.
– Marquizzo
17 March 2016 в 22:44
display: none
, (2) не использовал width/height: 0
, (3) put no-repeat
и такую позицию, чтобы изображение было снаружи (-<width>px -<height>px
вы получите там, поэтому, если ваши изображения имеют 100px по высоте или меньше, вы можете использовать 0 -100px
, другими словами url(...) no-repeat 0 -100px
.
– Alexis Wilke
10 August 2016 в 00:37
Вот мой подход:
var preloadImages = function (srcs, imgs, callback) {
var img;
var remaining = srcs.length;
for (var i = 0; i < srcs.length; i++) {
img = new Image;
img.onload = function () {
--remaining;
if (remaining <= 0) {
callback();
}
};
img.src = srcs[i];
imgs.push(img);
}
};
Да, это сработает, однако браузеры будут ограничивать (между 4-8) фактические вызовы и, таким образом, не кэшировать / предварительно загружать все нужные изображения.
Лучшим способом сделать это является вызов onload перед использованием изображение выглядит так:
function (imageUrls, index) {
var img = new Image();
img.onload = function () {
console.log('isCached: ' + isCached(imageUrls[index]));
*DoSomething..*
img.src = imageUrls[index]
}
function isCached(imgUrl) {
var img = new Image();
img.src = imgUrl;
return img.complete || (img .width + img .height) > 0;
}