Статьи

Введение в Loopj

Loopj — это библиотека Android для выполнения асинхронных HTTP-запросов. Мне нравится его простота использования и простота. Созданный Джеймсом Смитом, он также известен как «Android-асинхронный HTTP-клиент» и используется такими компаниями, как Instagram, Pinterest и многими другими . Это хорошая отправная точка в мир HTTP-библиотек, которая поможет вам легко понять важные понятия.

Чтобы научиться пользоваться этой библиотекой, мы собираемся создать MovieTrivia, простое приложение, которое подключается к веб-сервису для получения информации о фильмах или телешоу и отображает эту информацию для пользователя.

Для начала создайте новый проект 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 в своем приложении.

Мы собираемся создать максимально простой пользовательский интерфейс: просто 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);
    }
}

Теперь, если вы запустите приложение, вы должны увидеть результаты вашего запроса в окне журнала.

Разделение асинхронных операций на выделенные классы помогает поддерживать чистоту нашего кода, но это означает, что у нас нет прямого доступа к элементам пользовательского интерфейса. Чтобы показать результаты этих запросов, я рекомендую создать интерфейс слушателя. Это общая стратегия, которая обсуждается, например, в этом вопросе переполнения стека . У него три простых шага.

Сначала создайте интерфейс с единственным методом, который будет вызываться при получении результатов 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);
   }

Там у вас есть это. Когда вы запустите приложение, все данные из вашего асинхронного HTTP-запроса будут отображаться пользователю. Естественно, вы захотите проанализировать полученные данные JSON, чтобы извлечь только те части, которые вам нужны. Например, вы можете отобразить постер фильма, передав URL-адрес изображения постера Пикассо .

В этом руководстве вы увидели, как использовать Loopj, библиотеку для выполнения асинхронных HTTP-запросов в Android. Loopj прост в использовании всего за несколько строк кода. Теперь у вас нет никаких оправданий для того, чтобы не обновлять ваше приложение с контентом из вашего любимого веб-сервиса!