Включить Http-4.2.1 с Android-приложением

Я хочу включить последнюю версию Http в свое приложение для Android, то есть 4.2.1. Теперь вы хотите загрузить библиотеку с веб-сайта Apache и включить ее в папку libs, а затем в путь сборки моего приложения.

При включении Http - 4.2.1 я получил следующий вывод в logcat

08-28 02:42:40.917: D/dalvikvm(25641): DexOpt: 'Lorg/apache/http/client/ResponseHandler;' has an earlier definition; blocking out
08-28 02:42:40.917: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/Decoder;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/BinaryDecoder;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/Encoder;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/BinaryEncoder;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/DecoderException;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/EncoderException;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/StringDecoder;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/StringEncoder;' has an earlier definition; blocking out
08-28 02:42:40.927: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/StringEncoderComparator;' has an earlier definition; blocking out
08-28 02:42:40.937: D/dalvikvm(25641): DexOpt: 'Lorg/apache/commons/codec/binary/Base64;' has an earlier definition; blocking out
08-28 02:42:42.847: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HeaderElement;': multiple definitions
08-28 02:42:42.847: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HeaderElementIterator;': multiple definitions
08-28 02:42:42.847: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HeaderIterator;': multiple definitions
08-28 02:42:42.847: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpConnection;': multiple definitions
08-28 02:42:42.847: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpClientConnection;': multiple definitions
08-28 02:42:42.847: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpConnectionMetrics;': multiple definitions
08-28 02:42:42.847: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpEntity;': multiple definitions
08-28 02:42:42.857: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpMessage;': multiple definitions
08-28 02:42:42.857: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpRequest;': multiple definitions
08-28 02:42:42.857: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpEntityEnclosingRequest;': multiple definitions
08-28 02:42:42.857: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpException;': multiple definitions
08-28 02:42:42.857: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpHost;': multiple definitions
08-28 02:42:42.857: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpInetConnection;': multiple definitions
08-28 02:42:42.857: D/dalvikvm(25641): DexOpt: not verifying 'Lorg/apache/http/HttpRequestFactory;': multiple definitions

Мой вопрос: могу ли я это сделать? Не создаст ли это конфликт с уже включенной версией библиотеки Http вместе с SDK?


person Gaurav Agarwal    schedule 27.08.2012    source источник
comment
Если вы импортируете эту библиотеку и создаете объекты, используя ее явно (и не импортируете конфликтующую библиотеку в том же пространстве имен), все должно работать хорошо. Почему бы и нет?   -  person Kickaha    schedule 27.08.2012
comment
Хорошо, спасибо, я думаю, это ответ на вопрос.   -  person Gaurav Agarwal    schedule 27.08.2012
comment
Тогда я сделаю из этого ответ!   -  person Kickaha    schedule 27.08.2012
comment
Если вы импортируете эту библиотеку и создаете объекты, используя ее явно (и не импортируете конфликтующую библиотеку в том же пространстве имен), все должно работать хорошо.   -  person Kickaha    schedule 27.08.2012
comment
Android SDK имеет встроенный Http, как я узнаю, что класс, который я импортирую, из добавленной банки или из SDK.   -  person Gaurav Agarwal    schedule 28.08.2012


Ответы (2)


К сожалению, у этой проблемы нет элегантного и чистого решения. Единственный вариант, который у вас есть, — переместить все классы HttpClient в пользовательское пространство имен ('org.apache.http' -> 'my.http') с помощью подключаемого модуля maven shadow или с помощью предварительно упакованного форка доступной библиотеки здесь

ИЗМЕНИТЬ

На сегодняшний день можно также использовать официальный порт Apache HttpClient 4.3 для Google Android.

person ok2c    schedule 28.08.2012
comment
Спасибо Олег, Как жаль? - person Gaurav Agarwal; 28.08.2012
comment
@coding crow: Только представьте, как я себя чувствую, будучи тем глупым идиотом, который отстаивал идею поспешно заморозить незаконченные API 4.0, чтобы помочь Google с первым выпуском Android. - person ok2c; 28.08.2012
comment
Если я правильно понимаю, вы Олег Кальничевский. Мы все ценим и благодарим за работу на http-4.2.1. Я считаю, что Android должен придумать способ введения новых библиотек. Вы работаете потрясающе, продолжайте в том же духе, мы придумаем способ. - person Gaurav Agarwal; 28.08.2012
comment
@coding crow: в наши дни многие люди любят скулить по поводу HttpClient API, на самом деле не зная, насколько это является прямым результатом поспешного замораживания API, чтобы успеть к Android 1.0. Я постепенно переписывал и осуждал много старого кода. После выпуска 4.3 можно будет развернуть HC 4.3 с минимальными изменениями параллельно с HC 4.0beta1, поставляемым с Android, без конфликтов загрузчика классов. - person ok2c; 28.08.2012
comment
Это великолепно. HttpClient — очень важный API, и в Интернете его поддерживает сообщество. Пусть люди ругаются, я использую его, и многие отличные приложения используют его. Я знаю, что Instagram использует его. Вот очень хорошая библиотека для Android HttpClient http://loopj.com/android-async-http/. Отличная работа. - person Gaurav Agarwal; 28.08.2012

<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK">
<accessrules>
<accessrule kind="nonaccessible" pattern="org/apache/http/**"/>
</accessrules>
</classpathentry>

я исправил это, изменив файл .classpath приложения, как это, и я нашел решение в проекте с открытым исходным кодом open-gpstracker

person huntersea    schedule 24.05.2013