/**
  * 用户博客列表
  *
  * @param authoruid
  * @param pageIndex
  * @return
  * @throws AppException
  */
 public BlogList getUserBlogList(
     int authoruid, String authorname, int pageIndex, boolean isRefresh) throws AppException {
   BlogList list = null;
   String key =
       "userbloglist_"
           + authoruid
           + "_"
           + (URLEncoder.encode(authorname))
           + "_"
           + loginUid
           + "_"
           + pageIndex
           + "_"
           + PAGE_SIZE;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       list =
           ApiClient.getUserBlogList(this, authoruid, authorname, loginUid, pageIndex, PAGE_SIZE);
       if (list != null && pageIndex == 0) {
         Notice notice = list.getNotice();
         list.setNotice(null);
         list.setCacheKey(key);
         saveObject(list, key);
         list.setNotice(notice);
       }
     } catch (AppException e) {
       list = (BlogList) readObject(key);
       if (list == null) throw e;
     }
   } else {
     list = (BlogList) readObject(key);
     if (list == null) list = new BlogList();
   }
   return list;
 }
 /**
  * 下载图片-可指定显示图片的高宽
  *
  * @param url
  * @param width
  * @param height
  */
 private Bitmap downloadBitmap(String url, int width, int height) {
   Bitmap bitmap = null;
   try {
     // http加载图片
     bitmap = ApiClient.getNetBitmap(url);
     if (width > 0 && height > 0) {
       // 指定显示图片的高宽
       bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
     }
     // 放入缓存
     cache.put(url, new SoftReference<Bitmap>(bitmap));
   } catch (AppException e) {
     e.printStackTrace();
   }
   return bitmap;
 }
 /**
  * 获取用户信息个人专页(包含该用户的动态信息以及个人信息)
  *
  * @param uid 自己的uid
  * @param hisuid 被查看用户的uid
  * @param hisname 被查看用户的用户名
  * @param pageIndex 页面索引
  * @return
  * @throws AppException
  */
 public UserInformation getInformation(
     int uid, int hisuid, String hisname, int pageIndex, boolean isRefresh) throws AppException {
   String _hisname = "";
   if (!StringUtils.isEmpty(hisname)) {
     _hisname = hisname;
   }
   UserInformation userinfo = null;
   String key =
       "userinfo_"
           + uid
           + "_"
           + hisuid
           + "_"
           + (URLEncoder.encode(hisname))
           + "_"
           + pageIndex
           + "_"
           + PAGE_SIZE;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       userinfo = ApiClient.information(this, uid, hisuid, _hisname, pageIndex, PAGE_SIZE);
       if (userinfo != null && pageIndex == 0) {
         Notice notice = userinfo.getNotice();
         userinfo.setNotice(null);
         userinfo.setCacheKey(key);
         saveObject(userinfo, key);
         userinfo.setNotice(notice);
       }
     } catch (AppException e) {
       userinfo = (UserInformation) readObject(key);
       if (userinfo == null) throw e;
     }
   } else {
     userinfo = (UserInformation) readObject(key);
     if (userinfo == null) userinfo = new UserInformation();
   }
   return userinfo;
 }
 /**
  * 读取帖子详情
  *
  * @param post_id
  * @return
  * @throws ApiException
  */
 public Post getPost(int post_id, boolean isRefresh) throws AppException {
   Post post = null;
   String key = "post_" + post_id;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       post = ApiClient.getPostDetail(this, post_id);
       if (post != null) {
         Notice notice = post.getNotice();
         post.setNotice(null);
         post.setCacheKey(key);
         saveObject(post, key);
         post.setNotice(notice);
       }
     } catch (AppException e) {
       post = (Post) readObject(key);
       if (post == null) throw e;
     }
   } else {
     post = (Post) readObject(key);
     if (post == null) post = new Post();
   }
   return post;
 }
 /**
  * 留言列表
  *
  * @param pageIndex
  * @return
  * @throws AppException
  */
 public MessageList getMessageList(int pageIndex, boolean isRefresh) throws AppException {
   MessageList list = null;
   String key = "messagelist_" + loginUid + "_" + pageIndex + "_" + PAGE_SIZE;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       list = ApiClient.getMessageList(this, loginUid, pageIndex, PAGE_SIZE);
       if (list != null && pageIndex == 0) {
         Notice notice = list.getNotice();
         list.setNotice(null);
         list.setCacheKey(key);
         saveObject(list, key);
         list.setNotice(notice);
       }
     } catch (AppException e) {
       list = (MessageList) readObject(key);
       if (list == null) throw e;
     }
   } else {
     list = (MessageList) readObject(key);
     if (list == null) list = new MessageList();
   }
   return list;
 }
 /**
  * 获取动弹详情
  *
  * @param tweet_id
  * @return
  * @throws AppException
  */
 public Tweet getTweet(int tweet_id, boolean isRefresh) throws AppException {
   Tweet tweet = null;
   String key = "tweet_" + tweet_id;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       tweet = ApiClient.getTweetDetail(this, tweet_id);
       if (tweet != null) {
         Notice notice = tweet.getNotice();
         tweet.setNotice(null);
         tweet.setCacheKey(key);
         saveObject(tweet, key);
         tweet.setNotice(notice);
       }
     } catch (AppException e) {
       tweet = (Tweet) readObject(key);
       if (tweet == null) throw e;
     }
   } else {
     tweet = (Tweet) readObject(key);
     if (tweet == null) tweet = new Tweet();
   }
   return tweet;
 }
 /**
  * 软件详情
  *
  * @param soft_id
  * @return
  * @throws AppException
  */
 public Software getSoftware(String ident, boolean isRefresh) throws AppException {
   Software soft = null;
   String key = "software_" + (URLEncoder.encode(ident));
   if (isNetworkConnected() && (isCacheDataFailure(key) || isRefresh)) {
     try {
       soft = ApiClient.getSoftwareDetail(this, ident);
       if (soft != null) {
         Notice notice = soft.getNotice();
         soft.setNotice(null);
         soft.setCacheKey(key);
         saveObject(soft, key);
         soft.setNotice(notice);
       }
     } catch (AppException e) {
       soft = (Software) readObject(key);
       if (soft == null) throw e;
     }
   } else {
     soft = (Software) readObject(key);
     if (soft == null) soft = new Software();
   }
   return soft;
 }
 /**
  * 软件分类列表
  *
  * @param tag 第一级:0 第二级:tag
  * @return
  * @throws AppException
  */
 public SoftwareCatalogList getSoftwareCatalogList(int tag) throws AppException {
   SoftwareCatalogList list = null;
   String key = "softwarecataloglist_" + tag;
   if (isNetworkConnected() && isCacheDataFailure(key)) {
     try {
       list = ApiClient.getSoftwareCatalogList(this, tag);
       if (list != null) {
         Notice notice = list.getNotice();
         list.setNotice(null);
         list.setCacheKey(key);
         saveObject(list, key);
         list.setNotice(notice);
       }
     } catch (AppException e) {
       list = (SoftwareCatalogList) readObject(key);
       if (list == null) throw e;
     }
   } else {
     list = (SoftwareCatalogList) readObject(key);
     if (list == null) list = new SoftwareCatalogList();
   }
   return list;
 }
 /**
  * 新闻详情
  *
  * @param news_id
  * @return
  * @throws ApiException
  */
 public News getNews(int news_id, boolean isRefresh) throws AppException {
   News news = null;
   String key = "news_" + news_id;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       news = ApiClient.getNewsDetail(this, news_id);
       if (news != null) {
         Notice notice = news.getNotice();
         news.setNotice(null);
         news.setCacheKey(key);
         saveObject(news, key);
         news.setNotice(notice);
       }
     } catch (AppException e) {
       news = (News) readObject(key);
       if (news == null) throw e;
     }
   } else {
     news = (News) readObject(key);
     if (news == null) news = new News();
   }
   return news;
 }
 /**
  * 我的个人资料
  *
  * @param isRefresh 是否主动刷新
  * @return
  * @throws AppException
  */
 public MyInformation getMyInformation(boolean isRefresh) throws AppException {
   MyInformation myinfo = null;
   String key = "myinfo_" + loginUid;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       myinfo = ApiClient.myInformation(this, loginUid);
       if (myinfo != null && myinfo.getName().length() > 0) {
         Notice notice = myinfo.getNotice();
         myinfo.setNotice(null);
         myinfo.setCacheKey(key);
         saveObject(myinfo, key);
         myinfo.setNotice(notice);
       }
     } catch (AppException e) {
       myinfo = (MyInformation) readObject(key);
       if (myinfo == null) throw e;
     }
   } else {
     myinfo = (MyInformation) readObject(key);
     if (myinfo == null) myinfo = new MyInformation();
   }
   return myinfo;
 }
 /**
  * 博客详情
  *
  * @param blog_id
  * @return
  * @throws AppException
  */
 public Blog getBlog(int blog_id, boolean isRefresh) throws AppException {
   Blog blog = null;
   String key = "blog_" + blog_id;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       blog = ApiClient.getBlogDetail(this, blog_id);
       if (blog != null) {
         Notice notice = blog.getNotice();
         blog.setNotice(null);
         blog.setCacheKey(key);
         saveObject(blog, key);
         blog.setNotice(notice);
       }
     } catch (AppException e) {
       blog = (Blog) readObject(key);
       if (blog == null) throw e;
     }
   } else {
     blog = (Blog) readObject(key);
     if (blog == null) blog = new Blog();
   }
   return blog;
 }
 /**
  * Tag相关帖子列表
  *
  * @param tag
  * @param pageIndex
  * @return
  * @throws ApiException
  */
 public PostList getPostListByTag(String tag, int pageIndex, boolean isRefresh)
     throws AppException {
   PostList list = null;
   String key = "postlist_" + (URLEncoder.encode(tag)) + "_" + pageIndex + "_" + PAGE_SIZE;
   if (isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) {
     try {
       list = ApiClient.getPostListByTag(this, tag, pageIndex, PAGE_SIZE);
       if (list != null && pageIndex == 0) {
         Notice notice = list.getNotice();
         list.setNotice(null);
         list.setCacheKey(key);
         saveObject(list, key);
         list.setNotice(notice);
       }
     } catch (AppException e) {
       list = (PostList) readObject(key);
       if (list == null) throw e;
     }
   } else {
     list = (PostList) readObject(key);
     if (list == null) list = new PostList();
   }
   return list;
 }
 /**
  * 软件分类的软件列表
  *
  * @param searchTag 从softwarecatalog_list获取的tag
  * @param pageIndex
  * @return
  * @throws AppException
  */
 public SoftwareList getSoftwareTagList(int searchTag, int pageIndex, boolean isRefresh)
     throws AppException {
   SoftwareList list = null;
   String key = "softwaretaglist_" + searchTag + "_" + pageIndex + "_" + PAGE_SIZE;
   if (isNetworkConnected() && (isCacheDataFailure(key) || isRefresh)) {
     try {
       list = ApiClient.getSoftwareTagList(this, searchTag, pageIndex, PAGE_SIZE);
       if (list != null && pageIndex == 0) {
         Notice notice = list.getNotice();
         list.setNotice(null);
         list.setCacheKey(key);
         saveObject(list, key);
         list.setNotice(notice);
       }
     } catch (AppException e) {
       list = (SoftwareList) readObject(key);
       if (list == null) throw e;
     }
   } else {
     list = (SoftwareList) readObject(key);
     if (list == null) list = new SoftwareList();
   }
   return list;
 }
 /**
  * 删除博客评论
  *
  * @param uid 登录用户的uid
  * @param blogid 博客id
  * @param replyid 评论id
  * @param authorid 评论发表者的uid
  * @param owneruid 博客作者uid
  * @return
  * @throws AppException
  */
 public Result delBlogComment(int uid, int blogid, int replyid, int authorid, int owneruid)
     throws AppException {
   return ApiClient.delBlogComment(this, uid, blogid, replyid, authorid, owneruid);
 }
 /**
  * 删除评论
  *
  * @param id 表示被评论对应的某条新闻,帖子,动弹的id 或者某条消息的 friendid
  * @param catalog 表示该评论所属什么类型:1新闻 2帖子 3动弹 4动态&留言
  * @param replyid 表示被回复的单个评论id
  * @param authorid 表示该评论的原始作者id
  * @return
  * @throws AppException
  */
 public Result delComment(int id, int catalog, int replyid, int authorid) throws AppException {
   return ApiClient.delComment(this, id, catalog, replyid, authorid);
 }
 /**
  * 删除博客
  *
  * @param uid 登录用户的uid
  * @param authoruid 博客作者uid
  * @param id 博客id
  * @return
  * @throws AppException
  */
 public Result delBlog(int uid, int authoruid, int id) throws AppException {
   return ApiClient.delBlog(this, uid, authoruid, id);
 }
 /**
  * 转发留言
  *
  * @param uid 登录用户uid
  * @param receiver 接受者的用户名
  * @param content 消息内容,注意不能超过250个字符
  * @return
  * @throws AppException
  */
 public Result forwardMessage(int uid, String receiver, String content) throws AppException {
   return ApiClient.forwardMessage(this, uid, receiver, content);
 }
 /**
  * 清空通知消息
  *
  * @param uid
  * @param type 1:@我的信息 2:未读消息 3:评论个数 4:新粉丝个数
  * @return
  * @throws AppException
  */
 public Result noticeClear(int uid, int type) throws AppException {
   return ApiClient.noticeClear(this, uid, type);
 }
 /**
  * 获取用户通知信息
  *
  * @param uid
  * @return
  * @throws AppException
  */
 public Notice getUserNotice(int uid) throws AppException {
   return ApiClient.getUserNotice(this, uid);
 }
 /**
  * 更新用户头像
  *
  * @param portrait 新上传的头像
  * @return
  * @throws AppException
  */
 public Result updatePortrait(File portrait) throws AppException {
   return ApiClient.updatePortrait(this, loginUid, portrait);
 }
 /**
  * 发表博客评论
  *
  * @param blog 博客id
  * @param uid 登陆用户的uid
  * @param content 评论内容
  * @param reply_id 评论id
  * @param objuid 被评论的评论发表者的uid
  * @return
  * @throws AppException
  */
 public Result replyBlogComment(int blog, int uid, String content, int reply_id, int objuid)
     throws AppException {
   return ApiClient.replyBlogComment(this, blog, uid, content, reply_id, objuid);
 }
 /**
  * 用户删除收藏
  *
  * @param uid 用户UID
  * @param objid 比如是新闻ID 或者问答ID 或者动弹ID
  * @param type 1:软件 2:话题 3:博客 4:新闻 5:代码
  * @return
  * @throws AppException
  */
 public Result delFavorite(int uid, int objid, int type) throws AppException {
   return ApiClient.delFavorite(this, uid, objid, type);
 }
 /** 用户注销 */
 public void Logout() {
   ApiClient.cleanCookie();
   this.cleanCookie();
   this.login = false;
   this.loginUid = 0;
 }
 /**
  * 用户登录验证
  *
  * @param account
  * @param pwd
  * @return
  * @throws AppException
  */
 public User loginVerify(String account, String pwd) throws AppException {
   return ApiClient.login(this, account, pwd);
 }
 /**
  * 发表评论
  *
  * @param catalog 1新闻 2帖子 3动弹 4动态
  * @param id 某条新闻,帖子,动弹的id
  * @param uid 用户uid
  * @param content 发表评论的内容
  * @param isPostToMyZone 是否转发到我的空间 0不转发 1转发
  * @return
  * @throws AppException
  */
 public Result pubComment(int catalog, int id, int uid, String content, int isPostToMyZone)
     throws AppException {
   return ApiClient.pubComment(this, catalog, id, uid, content, isPostToMyZone);
 }
 /**
  * 发表博客评论
  *
  * @param blog 博客id
  * @param uid 登陆用户的uid
  * @param content 评论内容
  * @return
  * @throws AppException
  */
 public Result pubBlogComment(int blog, int uid, String content) throws AppException {
   return ApiClient.pubBlogComment(this, blog, uid, content);
 }
 /**
  * 发送留言
  *
  * @param uid 登录用户uid
  * @param receiver 接受者的用户id
  * @param content 消息内容,注意不能超过250个字符
  * @return
  * @throws AppException
  */
 public Result pubMessage(int uid, int receiver, String content) throws AppException {
   return ApiClient.pubMessage(this, uid, receiver, content);
 }
 /**
  * @param id 表示被评论的某条新闻,帖子,动弹的id 或者某条消息的 friendid
  * @param catalog 表示该评论所属什么类型:1新闻 2帖子 3动弹 4动态
  * @param replyid 表示被回复的单个评论id
  * @param authorid 表示该评论的原始作者id
  * @param uid 用户uid 一般都是当前登录用户uid
  * @param content 发表评论的内容
  * @return
  * @throws AppException
  */
 public Result replyComment(
     int id, int catalog, int replyid, int authorid, int uid, String content) throws AppException {
   return ApiClient.replyComment(this, id, catalog, replyid, authorid, uid, content);
 }
 /**
  * 更新用户之间关系(加关注、取消关注)
  *
  * @param uid 自己的uid
  * @param hisuid 对方用户的uid
  * @param newrelation 0:取消对他的关注 1:关注他
  * @return
  * @throws AppException
  */
 public Result updateRelation(int uid, int hisuid, int newrelation) throws AppException {
   return ApiClient.updateRelation(this, uid, hisuid, newrelation);
 }
 /**
  * 删除留言
  *
  * @param uid 登录用户uid
  * @param friendid 留言者id
  * @return
  * @throws AppException
  */
 public Result delMessage(int uid, int friendid) throws AppException {
   return ApiClient.delMessage(this, uid, friendid);
 }