Loopj — это библиотека Android для выполнения асинхронных HTTP-запросов. Мне нравится его простота использования и простота. Созданный Джеймсом Смитом, он также известен как «Android-асинхронный HTTP-клиент» и используется такими компаниями, как Instagram, Pinterest и многими другими . Это хорошая отправная точка в мир HTTP-библиотек, которая поможет вам легко понять важные понятия.
Чтобы научиться пользоваться этой библиотекой, мы собираемся создать MovieTrivia, простое приложение, которое подключается к веб-сервису для получения информации о фильмах или телешоу и отображает эту информацию для пользователя.
1. Настройка
Для начала создайте новый проект Android Studio с пустым действием. Чтобы включить Loopj, скопируйте зависимость с официального сайта . Вы можете найти зависимость в разделе «Установка и базовое использование» веб-сайта (или просто скопируйте строку ниже).
1
|
compile ‘com.loopj.android:android-async-http:1.4.9’
|
В правом верхнем углу появится сообщение «Синхронизировать сейчас». Нажмите на нее, чтобы Gradle загрузил библиотеку и сделал ее доступной для вашего проекта.
Поскольку приложение будет подключаться к Интернету, мы должны объявить соответствующее разрешение для авторизации пользователя. Откройте файл AndroidManifest.xml
и перед тегом application
напишите:
1
|
<uses-permission android:name=»android.permission.INTERNET»/>
|
Теперь вы готовы начать использовать Loopj в своем приложении.
2. Реализация
Мы собираемся создать максимально простой пользовательский интерфейс: просто TextField
для ввода поискового запроса, Button
для выполнения поиска и TextView
для отображения результатов. Откройте activity_mail.xml
и добавьте необходимые компоненты пользовательского интерфейса, как показано ниже.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?xml version=»1.0″ encoding=»utf-8″?>
<LinearLayout xmlns:android=»http://schemas.android.com/apk/res/android»
xmlns:tools=»http://schemas.android.com/tools»
android:layout_width=»match_parent»
android:layout_height=»match_parent»
android:orientation=»vertical»
android:padding=»@dimen/activity_vertical_margin»
tools:context=»com.pdrogfer.movietrivia.MainActivity»>
<LinearLayout
android:layout_width=»match_parent»
android:layout_height=»wrap_content»
android:orientation=»horizontal»>
<EditText
android:id=»@+id/etSearchTerms»
android:layout_width=»0dp»
android:layout_weight=»3″
android:layout_height=»wrap_content»
android:hint=»movie or tv show» />
<Button
android:id=»@+id/btnSearch»
android:layout_width=»0dp»
android:layout_weight=»1″
android:layout_height=»wrap_content»
android:text=»Search» />
</LinearLayout>
<TextView
android:id=»@+id/tvSearchResults»
android:layout_width=»match_parent»
android:layout_height=»wrap_content»
android:layout_marginTop=»24dp»
android:hint=»search results»/>
</LinearLayout>
|
Теперь, как обычно, MainActivity.java
эти компоненты в свой MainActivity.java
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText etSearchTerms;
Button btnSearch;
TextView tvSearchResults;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etSearchTerms = (EditText) findViewById(R.id.etSearchTerms);
btnSearch = (Button) findViewById(R.id.btnSearch);
tvSearchResults = (TextView) findViewById(R.id.tvSearchResults);
btnSearch.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String searchTerm = etSearchTerms.getText().toString();
etSearchTerms.setText(«»);
// make Loopj HTTP call
}
}
|
Чтобы ваш код был чистым и организованным, создайте отдельный класс Java, MyLoopjTask.java
, который будет содержать весь специфичный для Loopj код и операции. Вам понадобятся две переменные экземпляра: одна с типом RequestParams
для встраивания деталей поиска в URL, а другая с типом AsyncHttpClient
для фактического выполнения HTTP-запросов. Прежде чем идти дальше, убедитесь, что Android Studio добавил эти необходимые импорты.
1
2
|
import org.json.JSONObject;
import cz.msebera.android.httpclient.Header;
|
Также создайте метод, который принимает пользовательский запрос в качестве аргумента — именно здесь будет выполнена фактическая работа.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public class MyLoopjTask {
private static final String TAG = «MOVIE_TRIVIA»;
AsyncHttpClient asyncHttpClient;
RequestParams requestParams;
String BASE_URL = «http://www.omdbapi.com/?»;
String jsonResponse;
public MyLoopjTask() {
asyncHttpClient = new AsyncHttpClient();
requestParams = new RequestParams();
}
public void executeLoopjCall(String queryTerm) {
requestParams.put(«s», queryTerm);
asyncHttpClient.get(BASE_URL, requestParams, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
jsonResponse = response.toString();
Log.i(TAG, «onSuccess: » + jsonResponse);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
Log.e(TAG, «onFailure: » + errorResponse);
}
});
}
}
|
Как видите, вы можете добавить все необходимые ключи параметров запроса API с помощью экземпляра RequestParams
(в данном случае это просто запрос, введенный пользователем). Эта версия метода get()
возвращает объект JSON в onSuccess
, но есть и другие варианты, соответствующие вашим потребностям. (Используйте Ctrl+O
чтобы увидеть другие версии этого метода.)
Это все, что вам нужно сделать для реализации клиента Loopj для выполнения HTTP-вызовов к веб-сервису. В нашем случае мы хотим отправить наш запрос, когда пользователь нажимает кнопку «Поиск». Итак, вернувшись в MainActivity
, создайте экземпляр MyLoopjTask
и внутри executeLoopjCall
вызовите executeLoopjCall
с термином, введенным пользователем. MainActivity
будет выглядеть следующим образом.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText etSearchTerms;
Button btnSearch;
TextView tvSearchResults;
MyLoopjTask myLoopjTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etSearchTerms = (EditText) findViewById(R.id.etSearchTerms);
btnSearch = (Button) findViewById(R.id.btnSearch);
tvSearchResults = (TextView) findViewById(R.id.tvSearchResults);
btnSearch.setOnClickListener(this);
myLoopjTask = new MyLoopjTask();
}
@Override
public void onClick(View v) {
String searchTerm = etSearchTerms.getText().toString();
etSearchTerms.setText(«»);
// make loopj http call
myLoopjTask.executeLoopjCall(searchTerm);
}
}
|
Теперь, если вы запустите приложение, вы должны увидеть результаты вашего запроса в окне журнала.
3. Опубликовать результаты в пользовательском интерфейсе
Разделение асинхронных операций на выделенные классы помогает поддерживать чистоту нашего кода, но это означает, что у нас нет прямого доступа к элементам пользовательского интерфейса. Чтобы показать результаты этих запросов, я рекомендую создать интерфейс слушателя. Это общая стратегия, которая обсуждается, например, в этом вопросе переполнения стека . У него три простых шага.
Создать интерфейс
Сначала создайте интерфейс с единственным методом, который будет вызываться при получении результатов HTTP-запроса от Loopj.
1
2
3
|
public interface OnLoopjCompleted {
public void taskCompleted(String results);
}
|
Обновите обработчик асинхронных задач
В MyLoopjTask
измените конструктор так, чтобы он OnLoopjCompleted
качестве параметров Context
и экземпляр OnLoopjCompleted
.
1
2
3
4
5
6
|
public MyLoopjTask(Context context, OnLoopjCompleted listener) {
asyncHttpClient = new AsyncHttpClient();
requestParams = new RequestParams();
this.context = context;
this.loopjListener = listener;
}
|
Теперь, когда результаты запроса доступны в MyLoopjTask
, передайте их методу интерфейса слушателя.
1
2
3
4
5
6
7
|
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
jsonResponse = response.toString();
loopjListener.taskCompleted(jsonResponse);
Log.i(TAG, «onSuccess: » + jsonResponse);
}
|
Обновить активность
Наконец, выполните действие, которое вы хотите обновить — в данном случае MainActivity
OnLoopjCompleted
. Обновите инициализацию myLoopjTask
до myLoopjTask = new MyLoopjTask(this, this);
,
Поскольку ваша деятельность теперь реализует OnLoopjCompleted
, Android Studio заставит вас реализовать метод taskCompleted
. Там вы можете обновить пользовательский интерфейс новыми данными.
1
2
3
4
|
@Override
public void taskCompleted(String results) {
tvSearchResults.setText(results);
}
|
4. Заключение
Там у вас есть это. Когда вы запустите приложение, все данные из вашего асинхронного HTTP-запроса будут отображаться пользователю. Естественно, вы захотите проанализировать полученные данные JSON, чтобы извлечь только те части, которые вам нужны. Например, вы можете отобразить постер фильма, передав URL-адрес изображения постера Пикассо .
В этом руководстве вы увидели, как использовать Loopj, библиотеку для выполнения асинхронных HTTP-запросов в Android. Loopj прост в использовании всего за несколько строк кода. Теперь у вас нет никаких оправданий для того, чтобы не обновлять ваше приложение с контентом из вашего любимого веб-сервиса!