Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека AQuery

Общая информация
Подключаем библиотеку
Первый пример для знакомства
Загрузка картинки из интернета
Другие технологии

Общая информация

Рассмотрим примеры работы с библиотекой AQuery. Java-библиотека AQuery предназначена для быстрого и лёгкого программирования асинхронных задач, а также управления пользовательскими элементами управления.

Официальная страница библиотеки: android-query - Simpler Coding for Android

Подключаем библиотеку

Скачиваем последнюю версию библиотеки (около 100 кб).

Запускаем Eclipse и создаем новый проект Android Query. Добавляем на форму метку, кнопку и ImageView.


<RelativeLayout 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" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world"
        tools:context=".AQueryActivity" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:text="Button" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="24dp"
        android:src="@drawable/ic_action_search" />

</RelativeLayout>

Копируем скачанную библиотеку в папку libs через Проводник. Библиотека автоматически пропишется в проекте.

Первый пример для знакомства

Для первого знакомства разберем простой пример. Откроем основную активность и добавим код:

Показать код (щелкните мышкой)

package ru.alexanderklimov.androidquery;

import com.androidquery.AQuery;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

public class AQueryActivity extends Activity {

	private AQuery aq;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_aquery);

		// создаем объект AQuery
		aq = new AQuery(this);

		// TextView
		aq.id(R.id.textView1).text("Мяу!");

		// id(R.id.button) - кнопка
		// text("Нажми меня") - текст для кнопки
		// clicked(this, "buttonClicked") - обработчик для кнопки

		// Button
		aq.id(R.id.button1).text("Нажми на меня")
				.clicked(this, "buttonClicked");

		// ImageView
		aq.id(R.id.imageView1);
	}

	public void buttonClicked(View button) {
		// меняем текст в TextView
		aq.id(R.id.textView1).text("Мур мур");
	}
}

Посмотрите, какой интересный способ управления элементами у нас получился. Мы обращаемся к элементам управления через объект AQuery:

  • aq.id(R.id.button1) - кнопка
  • aq.id(R.id.imageView1) - ImageView
  • aq.id(R.id.textView1) - TextView

Причём, нам даже не пришлось импортировать нужные классы. Устанавливается текст через метод text(). Немного непривычно.

Можете запустить проект и нажать на кнопку, чтобы убедиться в работоспособности примера.

Загрузка картинки из интернета

Предыдущий пример любопытен, но не слишком практичен, так как мы можем добиться такого же эффекта классическим способом. Гораздо интереснее использоваться другие возможности библиотеки. В частности, с ёё помощью можно спокойно загрузить картинку из интернета. В стандартном варианте нам пришлось бы писать реализацию асинхронной загрузки с помощью AsyncTask. Посмотрите, как это делается в нашем случае:


// нажимаем на кнопку
public void buttonClicked(View button) {
	// загружаем картинку в ImageView из сети
	aq.id(R.id.imageView1).image(
			"http://developer.alexanderklimov.ru/kot-2-rss-100.png");
}

Запускаем проект и пробуем нажимать на кнопку. Ничего не происходит. Вспоминаем, чтобы забыли выставить нужное разрешение в манифесте:


<uses-permission android:name="android.permission.INTERNET"/>

Добавляем разрешение, запускаем проект и нажимаем на кнопку. Теперь всё работает. Но обратите внимание, что в предыдущем случае, наша программа не вылетала с ошибкой, несмотря на нашу забывчивость.

Androd Query

Как видите, с помощью библиотеки вам не нужно задумываться о сложных вещах. Всё сделали за вас.

На странице библиотеки вы можете найти дополнительные примеры кода загрузки очень больших изображений, которые можно автоматически уменьшить до нужных размеров для уменьшения потребления памяти.

Ещё один полезный пример - предположим, у нас не получилось загрузить нужную картинку из сети. В этом случае можно подставить картинку по умолчанию, загружаемую из ресурсов. Например, так:


// если не можем загрузить картинку, то используем картинку по умолчанию
// на моем сайте не может быть картинки со сраным пёсиком
String imageUrl = "http://developer.alexanderklimov.ru/dog.png";
aq.id(R.id.imageView1).image(imageUrl, true, true, 0, R.drawable.ic_launcher);

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

Кроме того, есть предварительная загрузка и вывод индикатора загрузки.

А ещё можно выводить картинку с анимацией!


String imageUrl = "http://developer.alexanderklimov.ru/kot-2-rss-100.png";    
aq.id(R.id.imageView1).image(imageUrl, true,true, 0, 0, null, AQuery.FADE_IN);

Можно также закруглить картинку:


String imageUrl = "http://developer.alexanderklimov.ru/kot-2-rss-100.png";    
ImageOptions options = new ImageOptions();
options.round = 15; // 15 пикселей
aq.id(R.id.imageView1).image(imageUrl, options);

Загрузка картинки из файла

Загрузку изображений из файлов, которые находятся на внутреннем или внешнем накопителе, тоже желательно делать в асинхронном режиме, особенно, если картинки большие и к ним идёт частое обращение. Библиотека и здесь нам пригодится. Причём можно сразу вывести картинку в нужном размере, избегая перерасхода памяти.


File file = new File(path);        

//load image from file, down sample to target width of 300 pixels  
aq.id(R.id.avatar).image(file, 300);

На странице библиотеки вы найдёте множество других интересных и полезных примеров с изображениями.

Другие технологии

Библиотека также позволяет работать с AJAX (http), Authentication, XML Parsing. Изучите их самостоятельно. Не пожалеете!

Реклама