实训第二周(2)

这周接下来我完成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();
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值