Проблемы с использованием unirest в Android Studio
Я получал некоторые ошибки в моем logcat, которые приводили к сбою приложения при попытке выполнить несколько самых нестандартных запросов. Я знаю, что вы должны сгенерировать специальный unirest jar со всеми зависимостями, но у меня были проблемы с maven и я этого не делал, вместо этого я включил зависимости отдельно в папку libs. Я сузил проблему до этой единственной ошибки ниже.
Logcat:
java.lang.VerifyError: com/mashape/unirest/http/options/Options
at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:154)
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:131)
at com.mashape.unirest.request.BaseRequest.asJson(BaseRequest.java:68)
Я понимаю, что java.lang.verifyerror вызван другой библиотекой, предоставляемой во время компиляции и во время выполнения. Но я не знаю, как это исправить. Пожалуйста, помогите, убедитесь, что все зависимости, которые мне нужны, приведены ниже, так как я не использовал unirest до этого.
build.gradle:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('libs/unirest-java-1.3.20.jar')
compile files('libs/rebound-0.3.6.jar')
compile files('libs/commons-io-2.4.jar')
compile files('libs/json-20140107.jar')
compile files('libs/httpmime-4.3.5.jar')
compile files('libs/httpclient-4.3.5.jar')
compile files('libs/httpasyncclient-4.0.2.jar')
compile files('libs/httpcore-4.3.2.jar')
compile files('libs/commons-codec-1.6.jar')
compile files('libs/commons-logging-1.1.3.jar')
}
как выглядит моя папка libs:
commons-io-2.4.jar
httpcore-4.3.2.jar
httpclient-4.3.5.jar
commons-logging-1.1.3.jar
json-20140107.jar
rebound-0.3.6.jar
unirest-java-1.3.20.jar
commons-codec-1.6.jar
httpmime-4.3.5.jar
httpasyncclient-4.0.2.jar
также включил это в build.gradle, потому что я получал ошибку дублирующегося файла при попытке построить файл gradle:
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
1 ответ
Я знаю, что прошло много времени с тех пор, как вы задали этот вопрос. Я думаю, что Android перезаписывает общие классы, расположенные в org.apache.http. Вы не можете перезаписать их самостоятельно. Попробуйте переместить загруженные пакеты в другое место, например, surrogate.org.apache.http, чтобы использовать их правильно.
С https://hc.apache.org/httpcomponents-client-4.3.x/android-port.html:
Google Android 1.0 был выпущен с предварительной бета-версией Apache HttpClient. Чтобы совпасть с первым выпуском Android, API-интерфейсы Apache HttpClient 4.0 пришлось преждевременно заморозить, в то время как многие интерфейсы и внутренние структуры все еще не были полностью проработаны. По мере развития Apache HttpClient 4.0 проект ожидал, что Google включит последние усовершенствования кода в свое кодовое дерево. К сожалению, этого не произошло. Версия Apache HttpClient, поставляемая с Android, по сути стала форком. В конечном итоге Google решил прекратить дальнейшую разработку своего форка, отказавшись обновлять его до стандартной версии Apache HttpClient, указав в качестве причины такого решения проблемы совместимости. В результате те разработчики Android, которые хотели бы продолжать использовать API-интерфейсы Apache HttpClient на Android, не могут воспользоваться новыми функциями, улучшениями производительности и исправлениями ошибок.
Если вы продолжите читать, вы найдете следующее:
Некоторые из классов реализации должны были быть скопированы (или заштрихованы) с разными именами, чтобы избежать конфликтов со старыми версиями тех же классов, включенных в среду выполнения Android. Можно улучшить совместимость со стандартной версией HttpClient, избегая классов 'org.apache.http.**.*HC4'.
использование
dependencies {
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}
включить httpcomponents.
Возможно, вам придется использовать плагин shadowJar для перемещения ваших зависимостей, если вы не хотите перемещать их вручную.
Редактировать:
Я нашел этот удивительный урок, который сработал для меня. Даже подумал, что порекомендую использовать AndroidAsync или Volley для создания соединений с веб-сервером.