【Android】Android에서의 redis client 작성 - publish/subscribe편

15198 단어 안드로이드Redis

00. 소개



redis는 소위 NoSQL 데이터베이스의 하나로, 그 이름(REmote DIctionary Server)대로 키 밸류 DB입니다.
메시징 기능을 가지고 있기 때문에 하나의 PC에서 여러 PC로 메시지를 보낼 수 있습니다.

Android에서 메시지를 송수신할 수 있다면 Android 기기를 리모컨으로 하는 애플리케이션의 작성도 용이해지므로 그 방법을 기술해 나갈 것입니다.


01. Android Project에 추가



이번에는 jedis라는 라이브러리를 사용합니다.
먼저 라이브러리를 사용하기 위해 gradle의 dependencies에 다음을 추가합니다.
compile 'redis.clients:jedis:2.9.0'

그런 다음 REmote의 이름과 같이 네트워크를 사용하므로 권한을 추가합니다.
(빌드 후에 권한을 잊어 버렸다는 것을 깨닫는 것은 있다고 생각한다)
<uses-permission android:name="android.permission.INTERNET" />

또한 연결 대상 redis의 protected-mode를 OFF로 둡니다.

/etc/redis/redis.conf
protected-mode no

02. publish



publish를하는 것은 쉽습니다.
private void publish(final String host, final int port, final String channel, final String message) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            if(!TextUtils.isEmpty(host) && port > 0) {
                try {
                    // 指定したホスト、ポートでJedisオブジェクトを生成する
                    Jedis jedis = new Jedis(host, port);
                    // publish
                    jedis.publish(channel, message);
                    // 切断
                    jedis.quit();
                } catch (Exception e) {
                    // pass
                }
            }
        }
    }).start();
}

Android에서는 UI Thread로 통신 처리를 할 수 없기 때문에, 우선 다른 Thread를 세웁니다.
그리고 세운 Thread내에서 jedis 객체를 작성해, publish를 실시합니다.
마지막으로 절단을 실시해 완료입니다.
간단하죠?

03. subscribe



subscribe는 조금 번거롭습니다.
먼저 subscribe 결과를 받는 JedisPubSub 객체를 만듭니다.
(작성은 Main Thread내에서 OK)
final JedisPubSub jedisPubSub = new JedisPubSub() {
    // subscribeで受信した際に呼ばれる
    @Override
    public void onMessage(final String channel, final String message) {
        Log.i(TAG, "onMessage(channel:" + channel + ", message:" + message + ")");
    }

    // psubscribeで受信した際に呼ばれる
    @Override
    public void onPMessage(String pattern, String channel, String message) {
        Log.i(TAG, "onPMessage(pattern:" + pattern + ", channel:" + channel + ", message:" + message + ")");
    }

    // subscribe開始時に呼ばれる
    @Override
    public void onSubscribe(String channel, int subscribedChannels) {
        Log.i(TAG, "onSubscribe(channel:" + channel + ", subscribedChannels:" + subscribedChannels + ")");
    }

    // unsubscribe時に呼ばれる
    @Override
    public void onUnsubscribe(String channel, int subscribedChannels) {
        Log.i(TAG, "onUnsubscribe(channel:" + channel + ", subscribedChannels:" + subscribedChannels + ")");
    }

    // psubscribeに呼ばれる
    @Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        Log.i(TAG, "onPSubscribe(pattern:" + pattern + ", subscribedChannels:" + subscribedChannels + ")");
    }

    // punsubscribe時に呼ばれる
    @Override
    public void onPUnsubscribe(String pattern, int subscribedChannels) {
        Log.i(TAG, "onPUnsubscribe(pattern:" + pattern + ", subscribedChannels:" + subscribedChannels + ")");
    }
};

Android Studio가 자동으로 생성하면 슈퍼 클래스의 메소드를 호출하도록 작성되지만 슈퍼 클래스에서는 아무 것도하지 않으므로 호출 할 필요가 없습니다.
그런 다음 다른 스레드 (Main Thread 외부)에서 subscribe를 시작합니다.
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // 指定したホスト、ポートでJedisオブジェクトを生成する
            Jedis jedis = new Jedis(mHost, mPort);
            // channelを指定してsubscribeを開始する
            jedis.subscribe(jedisPubSub, channels);
            // 接続終了依頼
            jedis.quit();
        } catch (Exception e) {
            // pass
        }
    }
}).start();

이상으로 subscribe를 할 수 있습니다.
subscribe를 종료할 때는 인수로 건네준 JedisPubSub 객체의 JedisPubSub#unsubscribe()를 호출합니다.
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            jedisPubSub.unsubscribe();
        } catch (Exception e) {
            // pass
        }
    }
}).start();

04. 샘플 앱




이번 publish/subscribe에 대한 샘플 앱을 만들었으므로, 자세한 내용은 아래 리포지토리의 MainActivity.java를 참조하십시오.
htps : // 기주 b. 코 m / 엔 탄 05 / ぢ s st

98. 참고



Jedis | htps : // 기주 b. 코 m / ぇ와 r 테오 / 지 ぢ s
Android Studio에서 라이브러리를 캡처하는 세 가지 방법 | h tp // 사케 보오 k. 하테나 bぉg. 코m/엔트리/2014/08/17/004540
Cannot connect to redis using jedis | h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 37867633 / 칸오 t - 콘 ct - ぢ
Android에서 인터넷에 연결하기위한 사용 권한 설정 | htps : // m / karu r4 n / ms / 5b439850 Ka 4 Aee 5b05d9
A Simple Jedis Publish/Subscribe Example | ㅜㅇㅇㅇㅇㅇ 코 m/2012/06/20/아-시 mpぇ-지ぢぢs뿌bぃshーすbsc리베에ぁmpぇ/

99. 변경 내역




날짜
변경 내용


2018/02/26


2018/03/01
샘플 앱 코드를 Github 링크로 변경

좋은 웹페이지 즐겨찾기