登录成功开启服务获取融云好友列表

前几天项目中整合融云即时通讯时碰到一个小问题,我的项目的首页并不是消息或者联系人界面,所以加载联系人并没有在一开始就加载,后来测试的时候发现,若初次登录或者退出帐号重新登录,若此时收到消息,在不点击联系人加载好友数据进行缓存的情况下,直接点击消息,会发现消息列表里面的消息全都不显示用户名以及头像。显示的是一串id以及默认的头像信息。仔细一想,肯定是联系人尚未加载的原因,于是乎想把联系人加载放到登录成功的时候,用服务进行加载并缓存。可能有人会问,为什么不直接开个子线程还要用服务,这是因为我考虑到当数据还在加载,页面又进行切换了的时候,可能会出现内存问题(这一块具体不知道怎么说,毕竟自身技术也处于成长期),具体咩有尝试,感兴趣的朋友可以试试。下面是我的代码

这个是Service开启时的一些初始化

@Override
	public int onStartCommand(Intent intent, int flags, int startId) {

		projId = intent.getStringExtra("projId");
		userId = intent.getStringExtra("userId");

		// 开启一个新的线程下载,如果使用Service同步下载,会导致ANR问题,Service本身也会阻塞
		//获取全部好友
		getFriendsFromService();
		//获取通公司群组
		getProjAndComService(Constans.GET_COMPANY_FRIEND_QUN_URL,
				GET_COMPANY_FRIENDS_REQUESTCODE);
		//获取同项目群组
		getProjAndComService(Constans.GET_PROJECT_FRIEND_QUN_URL,
				GET_PROJECT_FRIENDS_REQUESTCODE);

		return START_REDELIVER_INTENT;
	}

进行网络请求,这里就只展示获取全部好友的了,前两个方法是访问网络获取数据,后面则是进行一个数据库的本地缓存,以及对好友信息的一个初始化操作

/**
	 * 访问网络获取好友列表
	 */
	private void getFriendsFromService() {
		if (APPCache.isAvailable) {
			RequestParams params = HttpClientUtils
					.getBaseRequestParams(getApplicationContext());
			params.put("userid", userId);
			params.put("projid", projId);
			new AsyncHttpClient().post(Constans.GET_INIT_FRIEND_URL, params,
					new TextHandler(GET_ALL_FRIENDS_REQUESTCODE, this));
		}
	}

<span style="white-space:pre">	</span>@Override
	public void onTextSuccess(int requestCode, Header[] headers,
			String responseString) {
		if (requestCode == GET_ALL_FRIENDS_REQUESTCODE) {
			ResultList<StaffInfo> resultList = new Gson().fromJson(
					responseString, new TypeToken<ResultList<StaffInfo>>() {
					}.getType());
			if (resultList.getrCode() == 0) {
				List<StaffInfo> staffinfoList = resultList.getData();
				if (staffinfoList != null || !staffinfoList.isEmpty()) {
					saveSaffInfoList(staffinfoList);
				}
			}
		} 
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>/**
	 * 存储到本地数据库
	 * 
	 * @param cominfoList
	 */
	private void saveSaffInfoList(List<StaffInfo> staffinfoList) {
		// 先删除数据库
		DataSupport.deleteAll(StaffInfo.class);
		// 再存储数据库
		DataSupport.saveAll(staffinfoList);
		// 融云信息提供者初始化
		initUserInfo(staffinfoList);
		// 刷新用户信息提供者
		for (StaffInfo refstaff : staffinfoList) {
			RongIM.getInstance().refreshUserInfoCache(
					new UserInfo(refstaff.getUser_id(),
							refstaff.getUser_name(), Uri.parse(refstaff
									.getUser_avatar())));
		}
	}

<span style="white-space:pre">	</span>/**
	 * 初始化融云好友信息
	 */
	private void initUserInfo(final List<StaffInfo> staffinfoList) {
		RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {
			@Override
			public UserInfo getUserInfo(String userid) {
				for (StaffInfo staff : staffinfoList) {
					if (staff.getUser_id().equals(userid)) {
						return new UserInfo(staff.getUser_id(), staff
								.getUser_name(), Uri.parse(staff
								.getUser_avatar()));
					}
				}
				return null;
			}
		}, true);
	}
在MainActivity中的调用

<span style="white-space:pre">	</span>// 开启更新好友服务GetFriendsInfoService
	Intent serviceIntent = new Intent(MainActivity.this,GetFriendsInfoService.class);
	serviceIntent.putExtra("projId", projectId);
	serviceIntent.putExtra("userId", APPCache.user.getUser_id());
	startService(serviceIntent);
	//融云会话列表
	RongIM.setConversationListBehaviorListener(new  MyConversationBehaviorListener());

xml中的服务配置

<span style="white-space:pre">	</span><service android:name=".service.GetFriendsInfoService" >
            <intent-filter>
                <action android:name="com.youdi.jzb.service.GetFriendsInfoService" />
            </intent-filter>
        </service>

具体实现就是上面的步骤,本人技术尚未成熟,代码可能有点粗糙,如果有更好的方案或者想法的朋友可以提出来,大家互相学习

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值