这周接下来我完成MainActivity中的initHandler中声明的四个handler实现(完成了三个,第四个未完成):
1. NimOnlineStatusHandler
a. 使用getInstance()实例化
public static NimOnlineStatusHandler getInstance(){
if (instance == null){
synchronized (NimOnlineStatusHandler.class){
if (instance == null){
instance = new NimOnlineStatusHandler();
}
}
}
return instance;
}
b. 初始化
通过NimClient的getService接口获取到AuthServiceObserver(用户状态观察者接口)服务实例
可监听用户在线状态,登录成功后,SDK回负责维护与服务器的长连接以及断线重连等工作
当用户在线状态发生改变时,会发出通知
定义了三种情况,会导致MainActivity的initHandler中重写的requestReLogin或networkBroken:
@Override
public void requestReLogin(String message) {
ToastUtils.showMessage(MainActivity.this,"自动登陆失败或被踢出,请手动登陆~");
startActivity(new Intent(MainActivity.this,LoginActivity.class));
}
@Override
public void networkBroken() {
}
(1) StatusCode为UNLOGIN(未登录/登录失败)或FORBIDDEN(被服务器禁止登陆)
调用requestReLogin("UN_LOGIN"), 跳转到登录页面,显示“自动登录失败或被踢出,请手动登陆~”
(2) StatusCode为KICK_BY_OTHER_CLIENT(被同时在线的其他端主动踢掉)或KICKOUT(被其他端的登录踢掉)
调用requestReLogin("UN_LOGIN"), 跳转到登录页面,显示“自动登录失败或被踢出,请手动登陆~”
(3) StatusCode为NET_BROKEN(网络连接已断开)
调用networkBroken
public void init(){
mListeners = new ArrayList<>();
NIMClient.getService(AuthServiceObserver.class)
.observeOnlineStatus(new Observer<StatusCode>() {
@Override
public void onEvent(StatusCode statusCode) {
if (statusCode == StatusCode.UNLOGIN || statusCode == StatusCode.FORBIDDEN){
Log.e(TAG,"OnlineObserver---UN_LOGIN");
if (mListeners != null && !mListeners.isEmpty()){
for (OnStatusChangeListener listener : mListeners){
listener.requestReLogin("UN_LOGIN");
}
}
}else if (statusCode == StatusCode.KICK_BY_OTHER_CLIENT
|| statusCode == StatusCode.KICKOUT){
Log.e(TAG,"OnlineObserver---KICK_OUT");
if (mListeners != null && !mListeners.isEmpty()){
for (OnStatusChangeListener listener : mListeners){
listener.requestReLogin("KICK_OUT");
}
}
} else if (statusCode == StatusCode.NET_BROKEN){
Log.e(TAG,"OnlineObserver---NET_BROKEN");
if (mListeners != null && !mListeners.isEmpty()){
for (OnStatusChangeListener listener : mListeners){
listener.networkBroken();
}
}
}
}
},true);
}
附上完整代码:
package com.ezreal.ezchat.handler;
import android.util.Log;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
import com.netease.nimlib.sdk.StatusCode;
import com.netease.nimlib.sdk.auth.AuthServiceObserver;
import java.util.ArrayList;
import java.util.List;
/**
* Created by 张静 .
*/
public class NimOnlineStatusHandler {
private static final String TAG = NimOnlineStatusHandler.class.getSimpleName();
private static NimOnlineStatusHandler instance;
private List<OnStatusChangeListener> mListeners;
public static NimOnlineStatusHandler getInstance(){
if (instance == null){
synchronized (NimOnlineStatusHandler.class){
if (instance == null){
instance = new NimOnlineStatusHandler();
}
}
}
return instance;
}
public void init(){
mListeners = new ArrayList<>();
//用户状态观察者接口
//监听用户在线状态,登录成功后,SDK会负责维护与服务器的长连接以及断线重连等工作
//用户在线状态发生改变时,会发出通知
NIMClient.getService(AuthServiceObserver.class)
.observeOnlineStatus(new Observer<StatusCode>() {
@Override
public void onEvent(StatusCode statusCode) {
if (statusCode == StatusCode.UNLOGIN || statusCode == StatusCode.FORBIDDEN){
Log.e(TAG,"OnlineObserver---UN_LOGIN");
if (mListeners != null && !mListeners.isEmpty()){
for (OnStatusChangeListener listener : mListeners){
listener.requestReLogin("UN_LOGIN");
}
}
}else if (statusCode == StatusCode.KICK_BY_OTHER_CLIENT
|| statusCode == StatusCode.KICKOUT){
Log.e(TAG,"OnlineObserver---KICK_OUT");
if (mListeners != null && !mListeners.isEmpty()){
for (OnStatusChangeListener listener : mListeners){
listener.requestReLogin("KICK_OUT");
}
}
} else if (statusCode == StatusCode.NET_BROKEN){
Log.e(TAG,"OnlineObserver---NET_BROKEN");
if (mListeners != null && !mListeners.isEmpty()){
for (OnStatusChangeListener listener : mListeners){
listener.networkBroken();
}
}
}
}
},true);
}
public void setStatusChangeListener(OnStatusChangeListener listener){
mListeners.add(listener);
}
public void removeStatusChangeListener(OnStatusChangeListener listener){
mListeners.remove(listener);
}
public interface OnStatusChangeListener {
void requestReLogin(String message);
void networkBroken();
}
}
2. NimSysMsgHandler
(1)通过NimClient的getService接口获取到SystemMessageObserver(系统通知观察者)服务实例
添加好友请求发出后,对方会收到一条SystemMessage,可以通过SystemMessageObserver的observeReceiveSystemMsg函数来监听系统通知,通过getAttachObject函数可以获取添加好友的通知
public void init(){
mMessageListener = new ArrayList<>();
NIMClient.getService(SystemMessageObserver.class)
.observeReceiveSystemMsg(new Observer<SystemMessage>() {
@Override
public void onEvent(SystemMessage message) {
AddFriendNotify notify = (AddFriendNotify) message.getAttachObject();
if (notify != null){
for (SystemMessageListener l : mMessageListener){
l.addFriendNotify();
}
}
}
},true);
}
(2)其中,AddFriendNotify(为bean类):
public class AddFriendNotify {
private SystemMessage mMessage;
private NimUserInfo mUserInfo;//用户资料
private boolean isMyFriend;
public SystemMessage getMessage() {
return mMessage;
}
public void setMessage(SystemMessage message) {
mMessage = message;
}
public NimUserInfo getUserInfo() {
return mUserInfo;
}
public void setUserInfo(NimUserInfo userInfo) {
mUserInfo = userInfo;
}
public boolean isMyFriend() {
return isMyFriend;
}
public void setMyFriend(boolean myFriend) {
isMyFriend = myFriend;
}
}
(3)附上NimSysMsgHandler完整代码:
package com.ezreal.ezchat.handler;
import android.util.Log;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
import com.netease.nimlib.sdk.friend.model.AddFriendNotify;
import com.netease.nimlib.sdk.msg.SystemMessageObserver;
import com.netease.nimlib.sdk.msg.model.SystemMessage;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;
/**
* Created by 张静.
*/
public class NimSysMsgHandler {
private static final String TAG = NimSysMsgHandler.class.getSimpleName();
private static NimSysMsgHandler instance;
private List<SystemMessageListener> mMessageListener;
public static NimSysMsgHandler getInstance(){
if (instance == null){
synchronized (NimSysMsgHandler.class){
if (instance == null){
instance = new NimSysMsgHandler();
}
}
}
return instance;
}
public void init(){
mMessageListener = new ArrayList<>();
NIMClient.getService(SystemMessageObserver.class)
.observeReceiveSystemMsg(new Observer<SystemMessage>() {
@Override
public void onEvent(SystemMessage message) {
AddFriendNotify notify = (AddFriendNotify) message.getAttachObject();
if (notify != null){
for (SystemMessageListener l : mMessageListener){
l.addFriendNotify();
}
}
}
},true);
}
public void setMessageListener(SystemMessageListener listener){
mMessageListener.add(listener);
}
public interface SystemMessageListener{
void addFriendNotify();
}
}
3. NimFriendHandler
(1)通过NimClient的getService接口获取到FriendServiceObserve(好友关系、黑名单变更通知)服务实例来监听好友关系变化通知
public void init() {
mFriendAccounts = new ArrayList<>();
mFriends = new ArrayList<>();
mFriendInfos = new ArrayList<>();
// 初始化好友列表更新监听
NIMClient.getService(FriendServiceObserve.class)
.observeFriendChangedNotify(new Observer<FriendChangedNotify>() {
@Override
public void onEvent(FriendChangedNotify notify) {
loadFriendData();
}
}, true);
loadFriendData();
}
(2)读取账户好友列表数据
通过NimClient的getService接口获取到FriendService(好友管理/好友关系/黑名单关系/消息提醒相关操作)服务实例
调用getFriendAccounts获取我所有的好友账号
调用getFriendByAccount根据用户账号获取好友关系
通过NimClient的getService接口获取到UserService(用户资料操作相关接口)服务实例
调用getUserInfoList从本地数据库中批量获取用户资料(同步接口)
private void loadFriendData() {
mFriendAccounts.clear();
List<String> friendAccounts = NIMClient.getService(FriendService.class).getFriendAccounts();
if (friendAccounts == null || friendAccounts.isEmpty()) {
return;
}
mFriendAccounts.addAll(friendAccounts);
mFriends.clear();
Friend friend;
for (String account : mFriendAccounts) {
friend = NIMClient.getService(FriendService.class).getFriendByAccount(account);
mFriends.add(friend);
}
mFriendInfos.clear();
List<NimUserInfo> userInfoList = NIMClient.getService(UserService.class)
.getUserInfoList(mFriendAccounts);
mFriendInfos.addAll(userInfoList);
//更新用户界面
if (mUpdateListener != null){
mUpdateListener.friendUpdate();
}
}
(3)设置好友列表更新监听
public void setUpdateListener(OnFriendUpdateListener listener){
this.mUpdateListener = listener;
}
(4)检查该账户是否为我的好友
通过NimClient的getService接口获取到FriendService(好友管理/好友关系/黑名单关系/消息提醒相关操作)服务实例
public boolean CheckIsMyFriend(String account) {
return NIMClient.getService(FriendService.class).isMyFriend(account);
}
(5)附上完整代码
package com.ezreal.ezchat.handler;
import android.util.Log;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
import com.netease.nimlib.sdk.friend.FriendService;
import com.netease.nimlib.sdk.friend.FriendServiceObserve;
import com.netease.nimlib.sdk.friend.model.Friend;
import com.netease.nimlib.sdk.friend.model.FriendChangedNotify;
import com.netease.nimlib.sdk.uinfo.UserService;
import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;
import java.util.ArrayList;
import java.util.List;
/**
* Created by 张静.
*/
public class NimFriendHandler {
private static final String TAG = NimFriendHandler.class.getSimpleName();
private static NimFriendHandler instance;
private List<String> mFriendAccounts;
private List<NimUserInfo> mFriendInfos;
private List<Friend> mFriends;
private OnFriendUpdateListener mUpdateListener;
public static NimFriendHandler getInstance() {
if (instance == null) {
synchronized (NimFriendHandler.class) {
if (instance == null) {
instance = new NimFriendHandler();
}
}
}
return instance;
}
/**
* 初始化好友列表工具类
* 根据账户获取好友列表
* 同步本地数据库的好友账户数据
*/
public void init() {
mFriendAccounts = new ArrayList<>();
mFriends = new ArrayList<>();
mFriendInfos = new ArrayList<>();
// 初始化好友列表更新监听
NIMClient.getService(FriendServiceObserve.class)
.observeFriendChangedNotify(new Observer<FriendChangedNotify>() {
@Override
public void onEvent(FriendChangedNotify notify) {
loadFriendData();
}
}, true);
loadFriendData();
}
public List<String> getFriendAccounts() {
return mFriendAccounts;
}
public List<NimUserInfo> getFriendInfos() {
return mFriendInfos;
}
public List<Friend> getFriends() {
return mFriends;
}
/**
* 读取账户好友列表数据
*/
private void loadFriendData() {
mFriendAccounts.clear();
List<String> friendAccounts = NIMClient.getService(FriendService.class).getFriendAccounts();
if (friendAccounts == null || friendAccounts.isEmpty()) {
return;
}
mFriendAccounts.addAll(friendAccounts);
mFriends.clear();
Friend friend;
for (String account : mFriendAccounts) {
friend = NIMClient.getService(FriendService.class).getFriendByAccount(account);
mFriends.add(friend);
}
mFriendInfos.clear();
List<NimUserInfo> userInfoList = NIMClient.getService(UserService.class)
.getUserInfoList(mFriendAccounts);
mFriendInfos.addAll(userInfoList);
//更新用户界面
if (mUpdateListener != null){
mUpdateListener.friendUpdate();
}
}
/**
* 设置好友列表更新监听
* @param listener listener
*/
public void setUpdateListener(OnFriendUpdateListener listener){
this.mUpdateListener = listener;
}
/**
* 检查该账户是否为我的好友
*
* @param account 待检查账户
* @return true 如果对方是好友,否则返回 false
*/
public boolean CheckIsMyFriend(String account) {
return NIMClient.getService(FriendService.class).isMyFriend(account);
}
public void syncFriendInfo(List<String> accounts) {
NIMClient.getService(UserService.class).fetchUserInfo(accounts);
}
public interface OnFriendUpdateListener{
void friendUpdate();
}
}