Недавно я имел дело с вопросом, на который я не знаю, как ответить. Я написал пример кода для некоторой AsyncTask, которую хочу выполнить. Я где-то читал в сети, что кто-то реализовал AsyncTask и Handler как внутренние классы, и я хотел немного масштабировать это и сделать меньше связи, поэтому я сделал отдельный класс для них, чтобы я мог повторно использовать их с более чем одним действием. Поскольку мне нужно было делать разные вещи с пользовательским интерфейсом для каждого действия, я решил реализовать интерфейс для этих действий, чтобы я мог реагировать на каждое событие одними и теми же методами.
Чего я не понимаю, так это зачем мне нужен объект-обработчик, который будет обрабатывать сообщения для возникновения события? я не могу просто использовать шаблон наблюдателя слушателей? а затем вопрос, который я задал себе и не могу понять ответы в Интернете, заключается в том, в чем разница между моей реализацией наблюдателя-слушателя и объектом-обработчиком, который мы получаем от Android.
Вот мой пример кода:
Действие 1:
public class SomeActivity extends Activity implements MyListener{
MyAsyncTask myTask;
MyHandler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new MyHandler();
myTask = new MyAsyncTask(handler);
// initilize the activity views etc...
}
@Override
public void do1(){
// DO UI THINGS FOR ACTIVITY 1 IN A CALLBACK TO DO1 EVENT
}
@Override
public void do2(){
// DO UI THINGS FOR ACTIVITY 1 IN A CALLBACK TO DO2 EVENT
}
}
Действие 2:
public class OtherActivity extends Activity implements MyListener{
MyAsyncTask myTask;
MyHandler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new MyHandler();
myTask = new MyAsyncTask(handler);
// initilize the activity views etc...
}
@Override
public void do1(){
// DO UI THINGS FOR ACTIVITY 2 IN A CALLBACK TO DO1 EVENT
}
@Override
public void do2(){
// DO UI THINGS FOR ACTIVITY 2 IN A CALLBACK TO DO2 EVENT
}
}
Интерфейс слушателя:
public interface MyListener{
void do1();
void do2();
}
Реализация асинхронной задачи:
public class MyAsyncTask extends AsyncTask<Void,Void,String>{
private MyModel m;
public MyAsyncTask(Handler h){
m = new MyModel();
m.setHandler(h);
}
protected String doInBackground(Void... params) {
// do something in background with MyModel m
return null;
}
}
Реализация обработчика:
public class MyHandler extends Handler {
Vector<MyListener> listeners = new Vector<>();
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 1:
// do something for case 1
fireMethod1();
break;
case 2:
// do something for case 2
fireMethod2();
break;
}
}
public void registerListener(MyListener l){
listeners.add(l);
}
public void unregisterListener(MyListener l){
listeners.remove(l);
}
private void fireMethod1(){
for(MyListener l : listeners){
l.do1();
}
}
private void fireMethod2(){
for(MyListener l : listeners){
l.do2();
}
}
}
Некоторая демонстрационная модель, которую я создал:
public class MyModel{
private Handel h;
public MyModel(){
// at some point send message 1 or message 2 ...
}
public void setHandler(Handler h){
this.h = h;
}
private void sendMessage1(){
h.obtainMessage(1, null);
}
private void sendMessage2(){
h.obtainMessage(2, null);
}
}
если это слишком сложно для чтения кода, дайте мне знать, и если вы не хотите читать код, пожалуйста, помогите мне ответить в чем разница между обработчиком и прослушиванием событий с помощью шаблона наблюдателя? это разные решения одной и той же проблемы? спасибо!