Для функции a -> Integer
разрешено только одно поведение - возвращать постоянное целое число. Зачем? Потому что вы понятия не имеете, что такое тип a
. Без каких-либо ограничений, это может быть абсолютно все, и поскольку Haskell статически типизирован, вам нужно разрешить все, что связано с типами во время компиляции. Во время выполнения информация о типе больше не существует и, следовательно, с ней невозможно ознакомиться - все варианты выбора используемых функций уже сделаны.
Наиболее близким Haskell к этому типу поведения является использование классов типов - если вы создали класс типов с именем Foo
с одной функцией:
class Foo a where
foo :: a -> Integer
Тогда вы можете определить экземпляры этого типа для разных типов.
instance Foo [a] where
foo [] = 0
foo (x:xs) = 1 + foo xs
instance Foo Float where
foo 5.2 = 10
foo _ = 100
Тогда, пока вы можете гарантировать, что какой-то параметр x
является Foo
, вы можете вызвать foo
для него. Это все еще нужно, хотя вы не можете написать функцию
bar :: a -> Integer
bar x = 1 + foo x
, поскольку компилятор не знает, что a
является экземпляром Foo
. Вы должны сказать это или опустить сигнатуру типа и позволить ей понять это для себя.
bar :: Foo a => a -> Integer
bar x = 1 + foo x
Haskell может работать только с таким количеством информации, которое есть у компилятора о типе чего-либо. Это может показаться ограничительным, но на практике классы типов и параметрический полиморфизм настолько мощны, что я никогда не пропускаю динамическую типизацию. На самом деле, меня обычно раздражает динамическая типизация, потому что я никогда не совсем уверен, что на самом деле является чем-либо.
Похоже, вы хотите (часть) NIO - есть хороший учебник здесь , асинхронная сетевая часть начинается с p. 30 и много полезных ссылок в конце.
AFAIK, инструмент TCPMon использует подход, аналогичный тому, что вы описываете. Вы можете взглянуть на исходный код в их SVN-браузере
. Также посмотрите на WGET-java внутренности кода блокировки.
Но нужно ли вам писать это в Java? Есть много других подходов, использующих JRuby или Rhino для легкого выполнения чего-то подобного, которые будут работать на JVM, но не написаны на Java.
Итак, вероятно, стоит учесть, что ActionScript и Java не обслуживают одну и ту же нишу. Например, Java действительно делает некоторые вещи более утомительными, но обычно это дает пользователю больше возможностей в том, как, например, выполняется HTTP-соединение, тогда как ActionScript может абстрагироваться от деталей или возможных ошибок для простоты использования. Но ваша точка зрения все еще остается в силе.
Я сам не знаю асинхронного HTTP-клиента для Java. Ответ Алекса Мартелли говорит о Java NIO, что является хорошим ответом, если вы заинтересованы в реализации протокола HTTP в своем собственном коде. NIO позволит вам использовать сокеты для подключения к веб-серверу, но тогда вам придется вручную создавать свои собственные запросы GET и анализировать входящие HTTP-заголовки / данные.
Другой вариант - использовать java.net. Классы URL-адресов - и вы можете найти множество руководств для них в Интернете и на stackoverflow. Вы можете заключить их в потоки - так что ваша Java-программа будет иметь несколько потоков выполнения.
Но тогда вы столкнетесь с проблемой синхронизации. Я согласен, это неприятно, но зато он предлагает более детальный уровень гибкости.
(Я понимаю, что это не отвечает на ваш вопрос - и если кто-то действительно знает о java-средстве для выполнения асинхронных HTTP-запросов, я было бы интересно узнать!)
Если вы еще не рассматривали его, обратите внимание на Java 5 java.util.concurrent - он значительно упрощает разработку многопоточных приложений. Вы можете настроить ThreadPoolExecutor, который управляет, скажем, четырьмя потоками. Затем вы кормите пул любым количеством задач, которые нужно выполнить. Каждая задача запускается. ThreadPoolExecutor ставит в очередь задачи Runnable и параллельно передает их доступным потокам. Метод afterExecute () пула вызывается после завершения каждой задачи Runnable.
Я хорошо помню, как писал пул потоков выборки для веб-браузера, написанного на Java, еще в 1999 году, и это было медведем , чтобы разобраться. В прошлом месяце я написал тестер нагрузки для веб-сервера. У тестера есть ThreadPoolExecutor, который имеет n потоков, и задачи Runnable, которые я загружаю ему, загружают страницу с помощью HTTP-клиента Apache. Потребовалось всего час или два, чтобы он заработал достаточно хорошо. Я думаю, вам понравится java.util.concurrent в сочетании с HTTP-клиентом Apache, хотя похоже, что вам нужно будет выполнить некоторую настройку для индикации прогресса.
(Обратите внимание, что HTTP-клиент Apache выполняет собственный пул потоков, а конфигурация по умолчанию ограничивает вас максимум 20 потоками и только двумя для каждого веб-сервера.)
Обновление: здесь ссылка на HTTP-клиент Apache . Не забудьте прочитать о MultiThreadedHttpConnectionManager , это то, что обрабатывает пул соединений, и это не показано в самом простом примере.
(Обратите внимание, что HTTP-клиент Apache создает собственный пул потоков, а конфигурация по умолчанию ограничивает вас до 20 потоков и только двумя для каждого веб-сервера.)
Обновление: здесь ссылка на HTTP-клиент Apache . Не забудьте прочитать о MultiThreadedHttpConnectionManager , это то, что обрабатывает пул соединений, и это не показано в самом простом примере.
(Обратите внимание, что HTTP-клиент Apache создает собственный пул потоков, а конфигурация по умолчанию ограничивает вас до 20 потоков и только двумя для каждого веб-сервера.)
Обновление: здесь ссылка на HTTP-клиент Apache . Не забудьте прочитать о MultiThreadedHttpConnectionManager , это то, что обрабатывает пул соединений, и это не показано в самом простом примере.
Я бы рекомендовал запускать для этого отдельные потоки.
httpunit и htmlunit - это 2 настраиваемых и настраиваемых клиента Java http, способных работать с любыми браузерами, такими как имитация firefox, просмотр без головы, запланированные программные клиенты и агенты.
Нет, Графика Объект
не содержит данных изображения, он используется для рисования на холсте, которым обычно является экран или объект Bitmap
.
Итак, вам необходимо создать Bitmap
объект с правильным размером для рисования и создайте объект Graphics
для этого растрового изображения. Тогда вы можете сохранить это. Помните, что объект, реализующий IDisposable
, должен быть удален,
В этой статье обсуждается асинхронный HTTP на основе HttpClient с именем xLightweb
Я только что наткнулся на асинхронный HTTP-клиент, реализованный в Geronimo. Возможно, вы также захотите взглянуть на него, на http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ - Предостережение: последняя фиксация кажется старше года.
Другой проект, создающий асинхронный HTTP-клиент, - это xsocket: xsocket.sourceforge.net
Версия 4.0 Apache Commons HttpClient (теперь в HttpComponents / HttpCore ) также поддерживает NIO Java (неблокирующий ввод-вывод). Думаю, это ваш лучший выбор.
Используйте "Async Http Client", ранее называвшийся клиентской библиотекой ning http. См. http://code.ning.com/2010/03/introduction-nings-asynchronous-http-client-library/
Теперь доступно на GitHub {{1 }} https://github.com/ning/async-http-client
Asyncweb предоставляет асинхронный http-клиент вместе со своим http-сервером. Доступно для загрузки по следующему адресу: