// AsyncHandler interface
public interface AsyncHandler {
void onSuccess(Object result);
void onError(Object result);
}
// DAO implementation
public class MyDaoImpl<T, PK> implements Dao {
// Llamada síncrona
public T find(PK id) {
...
}
// Demás métodos del CRUD
}
// Service implementation with async-calls
public class MyServiceImpl<T, PK> implements Service {
// Implementación del DAO no asíncrona
private MyDaoImpl myDao;
// Llamada asíncrona - No devuelve nada porque el resultado lo manejará el handler
public void findByIdAsync(PK id, AsyncHandler handler) {
FindProxy proxy = new FindProxy(handler);
proxy.execute(id);
}
// Demás métodos del CRUD con firma asíncrona
// Una AsyncTask por cada método del DAO que se
// quiera llamar de forma asíncrona
private class FindProxy extends AsyncTask<PK, Void, T> {
private AsyncHandler _handler;
public FindProxy(AsyncHandler handler) {
this._handler = handler;
}
protected T doInBackground(PK... params) {
T result = this.myDao.find(params[0]);
return result;
}
protected void onPostExecute(T result){
if (result != null) {
this._handler.onSuccess(result);
} else {
this._handler.onError(result);
}
}
}
}
public interface AsyncHandler {
void onSuccess(Object result);
void onError(Object result);
}
// DAO implementation
public class MyDaoImpl<T, PK> implements Dao {
// Llamada síncrona
public T find(PK id) {
...
}
// Demás métodos del CRUD
}
// Service implementation with async-calls
public class MyServiceImpl<T, PK> implements Service {
// Implementación del DAO no asíncrona
private MyDaoImpl myDao;
// Llamada asíncrona - No devuelve nada porque el resultado lo manejará el handler
public void findByIdAsync(PK id, AsyncHandler handler) {
FindProxy proxy = new FindProxy(handler);
proxy.execute(id);
}
// Demás métodos del CRUD con firma asíncrona
// Una AsyncTask por cada método del DAO que se
// quiera llamar de forma asíncrona
private class FindProxy extends AsyncTask<PK, Void, T> {
private AsyncHandler _handler;
public FindProxy(AsyncHandler handler) {
this._handler = handler;
}
protected T doInBackground(PK... params) {
T result = this.myDao.find(params[0]);
return result;
}
protected void onPostExecute(T result){
if (result != null) {
this._handler.onSuccess(result);
} else {
this._handler.onError(result);
}
}
}
}