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