Сложение двух чисел в Android Studio с использованием Apache HTTP (клиент-серверное приложение)
Напишем приложение сложение двух чисел, где сложение двух чисел происходит на стороне сервера.
📖 Содержание ⬇️
Содержание
Внимание! В данной статье используются устаревшие классы по работе с запросами. В статье Сложение двух чисел в Android Studio с использованием HttpURLConnection (клиент-серверное приложение) | ↗️ приведен вариант с использованием классов, пришедших на замену.
В статье | ↗️ показан вариант приложения для отправки POST параметров.
Постановка задачи
В статье | ↗️ показан пример приложения под Android по сложению двух чисел. И там сложение двух чисел происходило в самом приложении, что логично. А в этом приложении мы из полей ввода считаем два числа и отправим их на сервер, который сложит два числа, отправит нам ответ, и мы этот ответ отобразим в текстовом поле.
На сервер поступает HTTP запрос с двумя переменными a и b. Переменные a и b передаются через GET параметры, то есть через адресную строку. Пример такого запроса:
https://[путь с скрипту]?a=2&b=3
Серверная часть
У вас должен быть сервер, доступный из Интернета, к которому можно обращаться.
В статье | ↗️ приведен пример серверной части на Java.
В статье | ↗️ приведен пример серверной части на PHP.
В статье буду использовать PHP скрипт, который я расположил по адресу https://github.com/Harrix/harrix.dev-articles-2017/tree/main/add-2-num-php-get/demo (если перейти по ссылке без параметров, то должно выдаваться error).
Пример запроса к серверу https://github.com/Harrix/harrix.dev-articles-2017/tree/main/add-2-num-php-get/demo?a=2&b=3 (а вот тут должно появиться число 5).
Создание Android проекта
Надеюсь, что вы сможете сами создать болванку приложения, так что закинул под спойлер.
Создание Android проекта

Рисунок 1 — Команда создания нового проекта

Рисунок 2 — Выбор пустой активности для нового проекта

Рисунок 3 — Выбор названия и настроек проекта

Рисунок 4 — Созданный проект
XML разметка
Пусть разметка файла activity_main.xml будет такой:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="vertical" >
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName" />
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Есть два поля ввода чисел, кнопка и поле для вывода суммы чисел. Все элементы имеют свои идентификаторы android:id:

Рисунок 5 — Разметка интерфейса приложения
В Android Studio 4.0 перейти к разметке XML файла можно по другому:

Рисунок 6 — Разметка интерфейса приложения в Android Studio 4.0
Добавление в Gradle
Для работы с запросами над потребуется дополнительная библиотека, которую мы сейчас подключим в Gradle.
В файле build.gradle (Module.app) в разделе dependencies добавьте следующие строчки:
android {
useLibrary 'org.apache.http.legacy'
}
После этого нажмите на ссылку Sync now:

Рисунок 7 — Добавление зависимости в Gradle
И ждем, когда закончится синхронизация:

Рисунок 8 — Полоска синхронизации Gradle
Добавляем разрешения
Приложение у нас будет обращаться в Интернет. Поэтому нужно ей дать на это разрешение в AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"/>

Рисунок 9 — Добавление разрешения на использование Интернета
Также добавьте следующее разрешение в <application>:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Рисунок 10 — Добавление разрешения uses-library
Java код
Был такой код файла MainActivity.java:
package com.example.clientadd2num;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Вначале объявим переменные кнопки, полей ввода и поля для вывода результата и соединим их с элементами из XML файла. Также назначим слушателя для клика кнопки:
package com.example.clientadd2num;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private EditText editText;
private EditText editText2;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.textView);
editText = (EditText)findViewById(R.id.editText);
editText2 = (EditText)findViewById(R.id.editText2);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
Запросы к серверу по времени могут быть длительными. Поэтому обязательно делаем их в другом потоке. Для этого внутри класса MainActivity создадим класс-наследник от AsyncTask:
class MyAsyncTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
// Тут будет запрос к серверу
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
В классе MyAsyncTask объявим переменные:
String a, b, answerHTTP;
А также определим переменную server, которая будет указывать на сервер, к которому мы будем осуществлять запрос. Если вы используйте свой сервер, то поменяйте значение:
String server = "https://harrix.dev/ru/articles/2017/add-2-num-php-get/demo";
В методе onPreExecute() считаем данные из полей ввода:
@Override
protected void onPreExecute() {
a = editText.getText().toString();
b = editText2.getText().toString();
super.onPreExecute();
}
В методе onPostExecute() выведем ответ сервера:
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
textView.setText(answerHTTP);
}
В методе doInBackground() будем обращаться к серверу:
@Override
protected String doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(server + "?a=" + a + "&b=" + b);
try {
HttpResponse response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
answerHTTP = EntityUtils.toString(entity);
}
}
catch (ClientProtocolException e) {
}
catch (IOException e) {
}
return null;
}
Теперь остается только создать экземпляр данного класса MyAsyncTask в слушателе клика кнопки и запустить его:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyAsyncTask().execute();
}
});
В итоге у меня получился вот такой файл:
package com.example.clientadd2num;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private EditText editText;
private EditText editText2;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
editText = (EditText) findViewById(R.id.editText);
editText2 = (EditText) findViewById(R.id.editText2);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyAsyncTask().execute();
}
});
}
class MyAsyncTask extends AsyncTask<String, String, String> {
String a, b, answerHTTP;
String server = "https://harrix.dev/ru/articles/2017/add-2-num-php-get/demo";
@Override
protected void onPreExecute() {
a = editText.getText().toString();
b = editText2.getText().toString();
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(server + "?a=" + a + "&b=" + b);
try {
HttpResponse response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
answerHTTP = EntityUtils.toString(entity);
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
textView.setText(answerHTTP);
}
}
}

Рисунок 11 — Java код активности
Всё. Можете запускать приложение и проверять работу:

Рисунок 12 — Результат работы программы