Загрузка изображений асинхронно в Android ListView

1. Введение

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

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

В этом учебнике мы создадим простое ListView в Android, который выполняет асинхронную загрузку данных из Интернета с помощью AsyncTask. Как вы можете видеть на скриншоте ниже, ListView содержит эскизы изображений на каждой строке, мы будет загружать изображения асинхронно форме сервера.

Если вы ищете асинхронную загрузку данных с сервера, мы рекомендуем вам прочитать через Android сети учебник.

2. что такое Android AsyncTask

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

Асинхронная задача определяется 3 универсальных типов, называется Params, прогресс и результат и 4 шага, называется onPreExecute и onPostExecute, doInBackground, onProgressUpdate.
В onPreExecute можно определить код, который необходимо выполнить перед фоновой обработки начинается.
Метод doInBackground() содержит код, который должен выполняться в фоновом режиме, здесь в doInBackground мы можем отправить результаты на несколько раз, чтобы поток событий методом publishProgress(), чтобы уведомить завершения фоновой обработки мы может просто возвращать результаты.
Метод onProgressUpdate() получает обновления хода выполнения из метода doInBackground, который публикуется через метод publishProgress, и этот метод может использовать этот прогресс обновление для обновления потока событий
Метод onPostExecute() обрабатывает результаты, возвращаемые методом doInBackground.
Если задачи async, не с помощью любых типов, то оно может быть помечено как тип Void.
Выполняющаяся задача async может быть отменено, вызвав метод cancel().
Универсальные типы, используемые в AsyncTask

Params, тип параметров, отправленных в задачи после выполнения
Прогресс, тип единиц прогресс опубликованы во время вычисления фона.
Результат, тип результата вычисления фона.
3. Загрузка изображения с помощью AsyncTask

Мы научились основам AsyncTask. Препятствуйте нам Взгляните на как использовать его практически для асинхронной загрузки изображения с веб. Для достижения этой цели давайте создавать новый класс и назовите его как ImageDownloaderTask.

В следующем фрагменте кода ожидает URL-адрес изображения, как параметр и инициировать загрузку образа загрузки запроса. Когда загрузка закончится, он отображает растровое изображение на просмотр изображения.

4. Загрузка изображения с веб-

Обратите внимание, что на предыдущем шаге мы вызов метода downloadBitmap(), но не объявил еще. Давайте создадим объявить метод downloadBitmap, который заботится о загрузки изображения и возвращение растрового изображения. Здесь мы используем HttpURLConnection для загрузки потока из заданных url. Узнайте больше о HttpURLConnection от нашего android сети учебник.
5. Создание пользовательских ListView

Теперь, когда мы понимаем основы AsyncTask, давайте приступим с создания настраиваемого списка представления в android. В центре внимания этого учебника пытались загрузки изображения. Если вы не знакомы с создания настраиваемого списка в android, вы можете прочитать наш учебник Android ListView.

5.1. Добавление ListView деятельности макет
Для простоты нашей деятельности макет содержит простое ListView, который охватывает общая доступная ширина и высота устройства. Создайте новый файл activity_main.xml в каталоге макета.

5.2. Создание списка Просмотр активности
Давайте теперь создать новый класс деятельность MainActivity.java в каталоге src проекта и вставьте следующий код. Мы завершим эту деятельность в разделе 3.5

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
5.3. Создание списка строк макета
Теперь давайте сосредоточиться на структуру для строки элемента списка. Как вы можете заметить, образуют на скриншоте выше, мы будем использовать RelativeLayout для создания простого списка строк. Крит новый файл list_row_layout.xml в каталоге макета и вставьте следующие блоки кода.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:padding="8dp">
    <ImageView
        android:id="@+id/thumbImage"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="10dp"
        android:background="@drawable/placeholder" />
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/thumbImage"
        android:minLines="2"
        android:paddingTop="5dp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/reporter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/title"
        android:layout_marginTop="5dp"
        android:layout_toRightOf="@id/thumbImage" />
    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/reporter"
        android:layout_alignParentRight="true" />
</RelativeLayout>

5.4. Создание настраиваемого списка адаптер
Адаптер является акты как мост между источником и адаптер представления данных например, ListView и GridView. Адаптер выполняет итерацию набора данных от начала до конца и создавать представления для каждого элемента в списке.

Создайте новый класс с именем CustomListAdapter и расширить его от BaseAdapter. Посетите здесь, чтобы узнать больше о android адаптеры.

public class CustomListAdapter extends BaseAdapter {
private ArrayList listData;
private LayoutInflater layoutInflater;
public CustomListAdapter(Context context, ArrayList listData) {
this.listData = listData;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return listData.size();
}
@Override
public Object getItem(int position) {
return listData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_row_layout, null);
holder = new ViewHolder();
holder.headlineView = (TextView) convertView.findViewById(R.id.title);
holder.reporterNameView = (TextView) convertView.findViewById(R.id.reporter);
holder.reportedDateView = (TextView) convertView.findViewById(R.id.date);
holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
NewsItem newsItem = (NewsItem) listData.get(position);
holder.headlineView.setText(newsItem.getHeadline());
holder.reporterNameView.setText("By, " + newsItem.getReporterName());
holder.reportedDateView.setText(newsItem.getDate());
if (holder.imageView != null) {
new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl());
}
return convertView;
}
static class ViewHolder {
TextView headlineView;
TextView reporterNameView;
TextView reportedDateView;
ImageView imageView;
}
}
5.5. Использование адаптера представление списка
Теперь у нас есть список представления и адаптера класс готов. Давайте приступим к завершения класса MainActivity. В следующем фрагменте кода используется для инициализации представления списка и назначьте настраиваемый адаптер.
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ArrayList<ListItem> listData = getListData();
        final ListView listView = (ListView) findViewById(R.id.custom_list);
        listView.setAdapter(new CustomListAdapter(this, listData));
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                ListItem newsData = (ListItem) listView.getItemAtPosition(position);
                Toast.makeText(MainActivity.this, "Selected :" + " " + newsData, Toast.LENGTH_LONG).show();
            }
        });
    }
    private ArrayList<ListItem> getListData() {
        ArrayList<ListItem> listMockData = new ArrayList<ListItem>();
        String[] images = getResources().getStringArray(R.array.images_array);
        String[] headlines = getResources().getStringArray(R.array.headline_array);
        for (int i = 0; i < images.length; i++) {
            ListItem newsData = new ListItem();
            newsData.setUrl(images[i]);
            newsData.setHeadline(headlines[i]);
            newsData.setReporterName("Pankaj Gupta");
            newsData.setDate("May 26, 2013, 13:35");
            listMockData.add(newsData);
        }
        return listMockData;
    }

Обратите внимание, что метод getListData() в деятельности используется для создания некоторых Макетные списка данных для представления списка. Для простоты в этом примере, мы используем массивов строк, определенный в файле ресурсов strings.xml. Но в реальном времени вы могли бы загрузить данные с сервера или получить его от любых других источников.

Добавьте следующие объявления массива строк в файл string.xml.

Как создать эффект размытия Bitmap в Android с помощью RenderScript

Андроид RenderScript framework API может использоваться для выполнения вычислительных задач на высокую производительность. RenderScript, главным образом, был разработан для использования с данным параллельных вычислений, хотя серийный вычислительно интенсивных рабочих нагрузок может также принести пользу. RenderScript выполнения будет параллелизации работ во всех процессоров, доступных на устройстве, например многоядерных ЦП, GPU или DSP, позволяя вам сосредоточиться на выражения алгоритмов, вместо того, чтобы планирование работы или балансировки нагрузки.

RenderScript особенно полезен для приложений, выполняющих обработки изображений, вычислительной фотографии или компьютерного зрения. Существует два способа, мы можем получить доступ к API платформы Android RenderScript:

Непосредственно с помощью классов API android.renderscript. Эти классы доступны от Android 3.0 (уровень 11 API) и выше.
Кроме того можно использовать классы пакета поддержки android.support.v8.renderscript. Библиотека классов поддержки доступны для устройств под управлением Android 2.2 (уровень 8 API) и выше.
Как пользоваться RenderScript
Чтобы использовать API-интерфейсы RenderScript библиотека поддержки, вы должны иметь средства Android SDK версии 22.2 или выше и SDK построить инструменты пересмотра 18.1.0 или выше.

После того, как у вас выше двух минимальных инструменты, вам нужно обновить настройки для процесса построения Android включить интерфейсы API RenderScript. В Android Studio проекта добавьте следующие конфигурации файл проекта build.gradle.


Следующий код, которые могут быть использованы фрагменты создания эффекта размытия растрового изображения в Android с использованием RenderScript API.
Выше фрагмент кода можно использовать для размытия ImageView следующим образом.

Пользовательские андроид TabsHost

Желая изменить вид по умолчанию TabWidget для Android? В этом учебнике мы изучим несколько различных способов настройки вашего приложения вкладки. С Android SDK 1.6 и выше, пакет SDK позволяет установить как на вкладке вместо только текст и значок. Мы использование использовать этот метод для создания пользовательских вкладок ищет.

Шаг 1: Создание макета

Во-первых, давайте создадим план XML, называемый main.xml, содержащий TabHost и TabWidget.

Шаг 2: Написать код вида деятельности

После того, как у нас есть макет, нам нужно создать нашей основной деятельности. Для этого вы можете иметь ваш класс расширения TabActivity. Однако если содержимое одной из вкладок MapView, вам будет нужно расширить MapActivity.

Давайте создадим класс под названием CustomTabActivity и его расширения TabActivity.

В методе onCreate() нам нужно установить содержание нашего XML макет и извлечь объект TabHost.

Далее мы хотим добавить наш вкладки. Мы добавим три вкладки для этого примера (с видом случайный текст как содержание) и использовать метод удобства (setupTab) для ясности.

Как правило мы бы использовать setIndicator и дать ему либо строкой или строкой и катры для значка. Теперь мы создание представления (метод createTabView) и установка индикатора к этому.

Шаг 3: Создание настраиваемой вкладки Макет

В createTabView мы раздувая tabs_bg.xml. Эта схема проста и просто имеет вид текста. Если вы хотите настроить это далее, можно редактировать tabs_bg и добавить ImageView и др.

tabs_bg.XML

Шаг 4: Настройте внешний вид представления

На данный момент, мы можем запустить этот пример, но вкладки будет очень скучно и не действительно слишком заказной. Поэтому здесь нам нужно выяснить, что мы хотим сделать, чтобы настроить. В этом учебнике мы создадим список состояние катры для фона вкладок, используя некоторые цветовые градиенты. Другие варианты заключается в использовании фактического катры изображения или 9 патч png.

Давайте изменить макет нашего tabs_bg и добавить два атрибута: фон, который указывает состояние списка катры и прямоугольников, который указывает список различных состояний катры.

tabs_bg.XML
Мы можем изменить текст ли вкладка активного, прессованный, выбранных или неактивных. Так давайте создадим список состояние для цвета текста.

tab_text_selector.XML


И мы хотим также изменить цвет фона. Вот селектор XML для фона вкладки.

tab_bg_selector.XML
Теперь с этой селектор уведомления мы устанавливаем активные и неактивные вкладки стола к другому катры. В этом случае это цвет градиента фигуры. Вы можете использовать изображения здесь.

Давайте определим tab_bg_selected.xml:
Шаг 5: Окончательные настройки

Так что теперь у нас есть решение реальных настраиваемой вкладки. Однаковы можете добавить катры для перехода между вкладками (вкладкаразделитель). В то время как Android используется атрибут разделителявкладки для TabWidget, он не кажется больше существовать. Поэтомурешение заключается в том, чтобы программно добавить этот холст.

1
mTabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider);
Убедитесь в том добавить эту строку перед вызовы setupTab!

Вот наш конечный продукт: