前几天项目中整合融云即时通讯时碰到一个小问题,我的项目的首页并不是消息或者联系人界面,所以加载联系人并没有在一开始就加载,后来测试的时候发现,若初次登录或者退出帐号重新登录,若此时收到消息,在不点击联系人加载好友数据进行缓存的情况下,直接点击消息,会发现消息列表里面的消息全都不显示用户名以及头像。显示的是一串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>
具体实现就是上面的步骤,本人技术尚未成熟,代码可能有点粗糙,如果有更好的方案或者想法的朋友可以提出来,大家互相学习