Listener и два класса: обмен данными

Итак, у тебя есть два класса. Первый, например, пусть будет Activity, второй — Task (наследник от AsyncTask), в котором будет выполняться какая-то операция в фоне. Задача состоит в том, что надо из Activity передать данные в AsyncTask, а после выполнения операция ее результат передать обратно в Activity.

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

Начнем с него, вот так вот он выглядит в итоге.

public interface Callback {
void onComplete(String result);
}

Мы можем по разному его использовать в нашем активити — мы можем его имплементировать, либо создавать отдельный экземпляр класса в при создании объекта типа Task. Рассмотрим оба варианта.

В первом случае к описанию нашего класса добавляется

implements Callback

и наша IDE автоматически предложит нам подставить в класс перегруженный метод onComplete, объявленный в интерфейсе. В итоге код будет выглядеть вот так

public class Activity implements Callback {
@Override
public void onComplete(String result) {

}

public void onCreate() {
new Task(this).execute("Your name");
}
}

Во втором случае мы создаем экземпляр класса при создании нашего таска:

public void onCreate() {
new Task(new Callback() {
@Override
public void onComplete(String result) {

}
}).execute("Your name");
}

Лично я предпочитаю первый вариант, но в некоторых случаях использование именно такого описания не подходит.

Что же происходит в классе Task? Давайте посмотрим.

public class Task extends AsyncTask<String, Void, String> {
private final Callback callback;

public Task(Callback callback) {
this.callback = callback;
}

@Override
protected String doInBackground(String... params) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

String result = "";
if (params != null && params.length > 0) result = params[0];
result += " = " + UUID.randomUUID().toString();

return result;
}

@Override
protected void onPostExecute(String s) {
if (callback != null) callback.onComplete(s);
}
}

В двух словах — мы передаем экземпляр класса Callback в конструкторе, он будет служить мостом передачи данных обратно в Activity. После выполнения операции в фоне (doInBackground) вызывается метод onPostExecute класса Task, который будет вызывать метод onComplete у нешего коллбека.

Вопрос — а где же параметры из Activity, которые должны передаваться в наш Task? Дело в том, что AsyncTask — это параметризированный класс, и мы можем указывать какие типы данных получаются при обработке и передаются в него. Подробнее читаем в документации https://developer.android.com/reference/android/os/AsyncTask.html

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.