¿Cómo se genera la clase con T y List <T>
Estoy tratando de generar mi estructura de clase.
Mostraré mi estructura real para ser más específica.
Estoy escribiendo la aplicación con soporte de modo offline, así que decidí implementar mi mecanismo de cache ETag en el uso de Robospice y GreenDao ORM .
- OnStart of new Actividad se llama antes de onStop de padre
- Cambiar ConnectionTimeout de Retrofit OkHttpClient en tiempo de ejecución
- RoboSpice con Gson y Realm
- Robospice en el contexto android.os.Service
- Uso de RoboSpice y RxJava
Necesito poner en caché sólo las solicitudes GET .
En primer lugar mis peticiones deben extender la solicitud de base (no la mía), en mi caso RetrofitSpiceRequest<T, V>
T is type of return data V is service type, in my case I am using Retrofit.
El problema es que el tipo de retorno no es la List of T
tipos List of T
por defecto y necesito crear una subclase que extienda la matriz de objetos T y que lo usen como tipo de retorno.
Algo como esto
public class City { .... .... .... public static class List extends ArrayList<City> { ..... ..... } }
Y utilice City.List como tipo de devolución.
Pero tengo mi DAO declarado como siguiente
public class CityDao extends AbstractDao<City, Long> { }
En cada solicitud (GET) necesito tener DAO específico como un miembro con el fin de los datos de la caché si difiere de los datos del servidor. O cargar datos de la base de datos local si no hay conexión.
El problema aquí es que la solicitud generada por el tipo T que es la mayoría de la lista, City.List en mi caso, de algunos objetos, pero mi dao se genera por, por ejemplo E tipo que es la ciudad en mi caso.
Quiero crear un método como este
public AbastractDao<T,Long> getRequestDao() { }
Pero en la medida en que mi solicitud devuelve City.List, no tengo idea de cómo generar esta clase, siento que es posible, pero ahora no hay ideas.
En caso de no genérico método dao, tengo que duplicar código como este
@Override public void insertReceivedData(City.List received) { mCityDao.insertOrReplaceInTx(received); } @Override public City.List getCachedData() { if (mFilterMap != null && mFilterMap.size() > 0) { return (City.List) mCityDao.loadAll(); } else { WhereCondition[] whereConditions = QueryUtils.convertPropertyMapToConditionalArray(mFilterMap); return (City.List) mCityDao.queryBuilder().where(whereConditions[0], Arrays.copyOfRange(whereConditions, 1, whereConditions.length)).list(); } }
En cada solicitud
Por favor comparta sus ideas.
Gracias.
- Qué es la Biblioteca RoboSpice en android
- ¿Cómo conectarse a una solicitud pendiente con RoboSpice (Splash> Actividad principal)?
- Guardando colección extranjera en ORMLite con Robospice y Scala
- Android: cómo recuperar el objeto JSON en caso de una excepción con RoboSpice
- RoboSpice y Jsoup
- RoboSpice lanzando excepciones okhttp
- Retrofit / Robospice: ¿Obtener los encabezados de respuesta de una solicitud exitosa?
- ¿Cómo puedo obtener Robospice para tratar cualquier cosa que no sea una respuesta 200 de Retrofit & OKHttp como un error
Termino con la siguiente solución. No es tan bueno como yo quería, pero funciona y mejor que duplicar código.
Mi clase de solicitud base.
public abstract class BaseGetRequest<L extends List<T>, T, V> extends RetrofitSpiceRequest<L, V> implements FilterableRequest { // Context protected Context mContext; // Filter used in request and in queries protected Map<Property, String> mFilterMap; // Session provided Singletone protected DaoSessionProvider mSessionProvider; public BaseGetRequest(Class<L> clazz, Class<V> retrofitedInterfaceClass, Context context, Map<Property, String> filterMap) { super(clazz, retrofitedInterfaceClass); mContext = context; mFilterMap = filterMap; mSessionProvider = ((DaoSessionProvider) mContext.getApplicationContext()); // TODO determine required retry count setRetryPolicy(new RetryPolicy() { @Override public int getRetryCount() { return 0; } @Override public void retry(SpiceException e) { } @Override public long getDelayBeforeRetry() { return 0; } }); } protected WhereCondition[] getWhereConditions() { return QueryUtils.convertPropertyMapToConditionalArray(mFilterMap); } public BaseGetRequestV2(Class<L> clazz, Class<V> retrofitedInterfaceClass, Context context) { this(clazz, retrofitedInterfaceClass, context, null); } public abstract AbstractDao<T, Long> getDao(); public abstract L createDataList(List<T> list); public L getCachedData() { if (mFilterMap != null && mFilterMap.size() > 0) { WhereCondition[] whereConditions = getWhereConditions(); return createDataList(getDao().queryBuilder().where(whereConditions[0], Arrays.copyOfRange(whereConditions, 1, whereConditions.length)).list()); } else { return createDataList(getDao().loadAll()); } } public abstract L getData(); @Override public Map<Property, String> getFilterMap() { return mFilterMap; } public Map<String, String> getStringMap() { return QueryUtils.convertPropertyMapToString(mFilterMap); } @Override public L loadDataFromNetwork() throws Exception { L receivedData = null; try { receivedData = getData(); WhereCondition[] conditions = getWhereConditions(); getDao().queryBuilder().where(conditions[0],Arrays.copyOfRange(conditions, 1, conditions.length)).buildDelete().executeDeleteWithoutDetachingEntities(); getDao().insertOrReplaceInTx(receivedData); } catch (Exception ex) { receivedData = getCachedData(); } return receivedData; } }
Y puedo extender esta clase
Public class NewsRequest extends BaseGetRequest {público estático final String TARGET_URL = "/ news"; NoticiasArticleDao mNewsArticleDao;
public NewsRequest(Context context) { this(context, null); } public NewsRequest(Context context, Map<Property, String> filterMap) { super(NewsArticle.List.class, API.class, context, filterMap); mNewsArticleDao = mSessionProvider.getDaoSession().getNewsArticleDao(); } @Override public AbstractDao<NewsArticle, Long> getDao() { return mNewsArticleDao; } @Override public NewsArticle.List createDataList(List<NewsArticle> list) { return new NewsArticle.List(list); } @Override public NewsArticle.List getData() { return getService().getNews(getStringMap()); }
}
- ¿Cómo puedo crear una notificación con un botón de deshacer como gmail?
- ¿Cómo puedo hacer una animación de log de introducción como la aplicación de skype?