Сложение двух чисел в Android Studio с использованием Apache HTTP (клиент-серверное приложение)

Featured image

Напишем приложение сложение двух чисел, где сложение двух чисел происходит на стороне сервера.

📖 Содержание ⬇️

Содержание

Внимание! В данной статье используются устаревшие классы по работе с запросами. В статье Сложение двух чисел в 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 файла можно по другому:

Разметка интерфейса приложения в Android Studio 4.0

Рисунок 6 — Разметка интерфейса приложения в Android Studio 4.0

Добавление в Gradle

Для работы с запросами над потребуется дополнительная библиотека, которую мы сейчас подключим в Gradle.

В файле build.gradle (Module.app) в разделе dependencies добавьте следующие строчки:

android {
    useLibrary 'org.apache.http.legacy'
}

После этого нажмите на ссылку Sync now:

Добавление зависимости в Gradle

Рисунок 7 — Добавление зависимости в Gradle

И ждем, когда закончится синхронизация:

Полоска синхронизации 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"/>

Добавление разрешения uses-library

Рисунок 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);
        }
    }
}

Java код активности

Рисунок 11 — Java код активности

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

Результат работы программы

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