Ну, одно практическое использование, которое я обнаружил, - это уменьшение кодовой таблички. Например:
void process_z_vec(vector<int>& vec)
{
auto print_2d = [](const vector<int>& board, int bsize)
{
for(int i = 0; i<bsize; i++)
{
for(int j=0; j<bsize; j++)
{
cout << board[bsize*i+j] << " ";
}
cout << "\n";
}
};
// Do sth with the vec.
print_2d(vec,x_size);
// Do sth else with the vec.
print_2d(vec,y_size);
//...
}
Без lambda вам может понадобиться сделать что-то для разных случаев bsize
. Конечно, вы могли бы создать функцию, но что, если вы хотите ограничить использование в рамках функции пользователя души? характер lambda выполняет это требование, и я использую его для этого случая.
HttpClient
больше не поддерживается в sdk 23. Вы должны использовать URLConnection
или перейти на sdk 22 (compile 'com.android.support:appcompat-v7:22.2.0'
)
Если вам нужен sdk 23, добавьте это в свою граду :
android {
useLibrary 'org.apache.http.legacy'
}
Вы также можете попытаться загрузить и включить HttpClient jar прямо в свой проект или использовать OkHttp вместо
Как уже упоминалось ранее, org.apache.http.client.HttpClient
больше не поддерживается:
SDK (уровень API) # 23.
Вы должны использовать java.net.HttpURLConnection
.
Если вы хотите сделать свой код (и жизнь) проще при использовании HttpURLConnection
, вот Wrapper
этого класса, позволит вам выполнять простые операции с GET
, POST
и PUT
с помощью JSON
, например, с помощью HTTP PUT
.
HttpRequest request = new HttpRequest(API_URL + PATH).addHeader("Content-Type", "application/json");
int httpCode = request.put(new JSONObject().toString());
if (HttpURLConnection.HTTP_OK == httpCode) {
response = request.getJSONObjectResponse();
} else {
// log error
}
httpRequest.close()
Не стесняйтесь использовать его.
package com.calculistik.repository;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
* <p>
* Copyright © 2017, Calculistik . All rights reserved.
* <p>
* Oracle and Java are registered trademarks of Oracle and/or its
* affiliates. Other names may be trademarks of their respective owners.
* <p>
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* https://netbeans.org/cddl-gplv2.html or
* nbbuild/licenses/CDDL-GPL-2-CP. See the License for the specific
* language governing permissions and limitations under the License.
* When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this particular file
* as subject to the "Classpath" exception as provided by Oracle in the
* GPL Version 2 section of the License file that accompanied this code. If
* applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
* <p>
* Contributor(s):
* Created by alejandro tkachuk @aletkachuk
* www.calculistik.com
*/
public class HttpRequest {
public static enum Method {
POST, PUT, DELETE, GET;
}
private URL url;
private HttpURLConnection connection;
private OutputStream outputStream;
private HashMap<String, String> params = new HashMap<String, String>();
public HttpRequest(String url) throws IOException {
this.url = new URL(url);
connection = (HttpURLConnection) this.url.openConnection();
}
public int get() throws IOException {
return this.send();
}
public int post(String data) throws IOException {
connection.setDoInput(true);
connection.setRequestMethod(Method.POST.toString());
connection.setDoOutput(true);
outputStream = connection.getOutputStream();
this.sendData(data);
return this.send();
}
public int post() throws IOException {
connection.setDoInput(true);
connection.setRequestMethod(Method.POST.toString());
connection.setDoOutput(true);
outputStream = connection.getOutputStream();
return this.send();
}
public int put(String data) throws IOException {
connection.setDoInput(true);
connection.setRequestMethod(Method.PUT.toString());
connection.setDoOutput(true);
outputStream = connection.getOutputStream();
this.sendData(data);
return this.send();
}
public int put() throws IOException {
connection.setDoInput(true);
connection.setRequestMethod(Method.PUT.toString());
connection.setDoOutput(true);
outputStream = connection.getOutputStream();
return this.send();
}
public HttpRequest addHeader(String key, String value) {
connection.setRequestProperty(key, value);
return this;
}
public HttpRequest addParameter(String key, String value) {
this.params.put(key, value);
return this;
}
public JSONObject getJSONObjectResponse() throws JSONException, IOException {
return new JSONObject(getStringResponse());
}
public JSONArray getJSONArrayResponse() throws JSONException, IOException {
return new JSONArray(getStringResponse());
}
public String getStringResponse() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
for (String line; (line = br.readLine()) != null; ) response.append(line + "\n");
return response.toString();
}
public byte[] getBytesResponse() throws IOException {
byte[] buffer = new byte[8192];
InputStream is = connection.getInputStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
for (int bytesRead; (bytesRead = is.read(buffer)) >= 0; )
output.write(buffer, 0, bytesRead);
return output.toByteArray();
}
public void close() {
if (null != connection)
connection.disconnect();
}
private int send() throws IOException {
int httpStatusCode = HttpURLConnection.HTTP_BAD_REQUEST;
if (!this.params.isEmpty()) {
this.sendData();
}
httpStatusCode = connection.getResponseCode();
return httpStatusCode;
}
private void sendData() throws IOException {
StringBuilder result = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
result.append((result.length() > 0 ? "&" : "") + entry.getKey() + "=" + entry.getValue());//appends: key=value (for first param) OR &key=value(second and more)
}
sendData(result.toString());
}
private HttpRequest sendData(String query) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
writer.write(query);
writer.close();
return this;
}
}
Использовать Apache HTTP для SDK уровня 23:
Top level build.gradle - /build.gradle
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
// Lowest version for useLibrary is 1.3.0
// Android Studio will notify you about the latest stable version
// See all versions: http://jcenter.bintray.com/com/android/tools/build/gradle/
}
...
}
Уведомление от студии Android о обновлении градиента:
Тип модуля build.gradle - /app/build.gradle
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
...
useLibrary 'org.apache.http.legacy'
...
}
HttpClient больше не поддерживается в sdk 23. Релиз Android 6.0 (API Level 23) удаляет поддержку для HTTP-клиента Apache. Вы должны использовать
android {
useLibrary 'org.apache.http.legacy'
.
.
.
, а также добавить ниже фрагмент кода в вашей зависимости:
// http окончательное решение для веб-сервиса (включая загрузку файлов)
compile('org.apache.httpcomponents:httpmime:4.3.6') {
exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
Он также поможет вам, пока вы используете Use MultipartEntity для загрузки файлов.
в API 22 они устаревают, и в API 23 они полностью их удалили, простое обходное решение, если вам не нужны все причудливые вещи из новых дополнений, - просто использовать файлы .jar из apache, которые были интегрированы перед API 22, но в виде отдельных файлов .jar:
1. http://hc.apache.org/downloads.cgi
2. download httpclient 4.5.1, the zile file
3. unzip all files
4. drag in your project httpclient-4.5.1.jar, httpcore-4.4.3.jar and httpmime-4.5.1.jar
5. project, right click, open module settings, app, dependencies, +, File dependency and add the 3 files
6. now everything should compile properly
Ответ TejaDroid в ссылке ниже помог мне. Невозможно импортировать org.apache.http.HttpResponse в Android Studio
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
...
}
1- загрузка файлов jar Apache (с этого ответа). 4.5.zip файл из: https://hc.apache.org/downloads.cgi?Preferred=http%3A%2F%2Fapache.arvixe. com% 2F
2- откройте zip, скопируйте файлы jar в папку libs. Вы можете найти его, если перейдете к вершине своего проекта, где говорится «Android», вы найдете список, когда вы нажмете его. Итак,
Android -> Project -> app -> libs
, затем поместите там банки.
3- В сборке .gradle (Module: app) add
compile fileTree(dir: 'libs', include: ['*.jar'])
в
dependency { }
4- В классе java добавьте следующие импорты:
import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreProtocolPNames;
Ошибка: (30, 0) Метод Gradle DSL не найден: 'classpath ()' Возможные причины:
Клиент ApacheHttp удален в v23 sdk. Вы можете использовать HttpURLConnection или сторонний Http-клиент, например OkHttp.
ref: https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client
HttpUrlConnection
на самом деле рекомендуется вместо HttpClient
– Ben Pearson
1 October 2015 в 10:15
Какой целевой API вы используете в своем проекте? AndroidHttpClient
предназначен только для уровня API 8. и посмотрите здесь
, наслаждайтесь своим кодом:)
Просто используйте это: -
android {
.
.
.
useLibrary 'org.apache.http.legacy'
.
.
.
}
Вы можете просто добавить это в зависимости от Gradle:
compile "org.apache.httpcomponents:httpcore:4.3.2"
HttpGet
. Для этого я использовал compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
– AlexAndro
5 October 2015 в 09:10
Вы должны добавить только одну строку
useLibrary 'org.apache.http.legacy'
в build.gradle (Module: app), например
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.avenues.lib.testotpappnew"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}
Другой способ - если у вас есть файл httpclient.jar, вы можете сделать это:
blockquote>Вставьте свой .jar-файл в папку «libs» в вашем проекте. Затем в градиенте добавьте эту строку в свой build.gradle (Module: app)
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:23.0.0' compile files('libs/httpcore-4.3.3.jar') }
Попробуйте это сработало для меня. Добавьте эту зависимость в ваш файл build.gradle
compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
Добавьте эти две строки в зависимости от зависимостей
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
, затем
useLibrary 'org.apache.http.legacy'
под андроидом
Если вам нужен sdk 23, добавьте это в свою граду:
android {
useLibrary 'org.apache.http.legacy'
}
HttpClient не поддерживается в sdk 23 и 23 +.
Если вам нужно использовать в sdk 23, добавьте ниже код к вашему gradle:
android {
useLibrary 'org.apache.http.legacy'
}
Его работа для меня. Надеюсь, вам полезно.
Я думаю, в зависимости от того, какая версия Android Studio у вас есть, важно также обновить свою студию Android, я тоже разочаровался в советах каждого, но не повезло, пока мне не пришлось обновлять версию Android от 1.3 до 1.5, ошибки исчезли, как магия.
HttpClient устарел на уровне API 22 и удален в API-уровне 23. Вы все равно можете использовать его в API-интерфейсе 23 и далее, если вам нужно, однако лучше всего перейти к поддерживаемым методам обработки HTTP. Итак, если вы компилируете с 23, добавьте это в свой build.gradle:
android {
useLibrary 'org.apache.http.legacy'
}
android { useLibrary 'org.apache.http.legacy' }
[когда u добавить это] [1] 'org.apache.http' Android-студия все еще имеет советы: «Невозможно разрешить символ» [2 ] это может сделать андроид-студия (с sdk23). хотя есть подсказки (не удается разрешить символ) [3] , если вы добавляете jar, нет никаких советов, можете создавать, но !!! не может работать, потому что у него есть две копии 'org.apache.http'
– YETI
16 September 2015 в 07:44
релиз Android 6.0 (API Level 23) удаляет поддержку для HTTP-клиента Apache. Следовательно, вы не можете использовать эту библиотеку непосредственно в API 23. Но есть способ ее использования. Добавьте useLibrary 'org.apache.http.legacy' в ваш файл build.gradle, как показано ниже -
android {
useLibrary 'org.apache.http.legacy'
}
Если это не сработает, вы можете применить следующий хак -
- Скопируйте файл org.apache.http.legacy.jar, который находится в каталоге / platform / android-23 / optional вашего каталога Android SDK в папку вашего приложения / libs вашего проекта.
- Теперь добавьте файлы компиляции ('libs /org.apache.http.legacy.jar ') внутри зависимых {} разделов файла build.gradle.
android { useLibrary 'org.apache.http.legacy' }
[когда u добавить это] [1] 'org.apache.http' Android-студия все еще имеет советы: «Невозможно разрешить символ» [2 ] это может сделать андроид-студия (с sdk23). хотя есть подсказки (не удается разрешить символ) [3] , если вы добавляете jar, нет никаких советов, можете создавать, но !!! не может работать, потому что у него есть две копии 'org.apache.http' – YETI 16 September 2015 в 07:46