/** * $id$ * Copyright 2011-2012 Renren Inc. All rights reserved. */ package com.renren.api.connect.android.common; import java.lang.reflect.Constructor; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import com.renren.api.connect.android.exception.RenrenError; /** * 对发布状态、新鲜事、照片等请求进行响应的listener的抽象类 * * @author Shaofeng Wang (shaofeng.wang@renren-inc.com) * */ public abstract class AbstractRequestListener<T extends ResponseBean> { /** * 将response请求解析为针对具体请求的bean * * @param response * 请求完成后的响应字符串 * @return * 若解析成功,返回解析后的对象,否则返回null */ @SuppressWarnings("unchecked") public T parse(String response) { Class<?> c = this.getGenericType(); try { Constructor<T> constructor = (Constructor<T>) c.getDeclaredConstructor(String.class); T result = constructor.newInstance(response); return result; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取T的类型 * @param index * @return */ private Class<?> getGenericType() { Type genType = getClass().getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (params.length < 1) { throw new RuntimeException("Index outof bounds"); } if (!(params[0] instanceof Class)) { return Object.class; } return (Class<?>) params[0]; } /** * 请求完成后以对象形式返回服务器的响应的结果 * * @param bean * 服务器返回的响应字符串解析后得到的对象 * */ public abstract void onComplete(T bean); /** * 服务器返回了错误结果,已经正确的链接上了服务器但有错误如:缺少参数、sessionKey过期等。 * * @param renrenError */ public abstract void onRenrenError(RenrenError renrenError); /** * 在请求期间发生了严重问题(如:网络故障、访问的地址不存在等) * * @param fault */ public abstract void onFault(Throwable fault); }