簡體   English   中英

在android應用類中監聽socket.io事件並更新LiveData(android.arch.lifecycle的一個類)

[英]Listening socket.io events and updating LiveData (a class of android.arch.lifecycle)in application class android

我正在開發一個聊天應用程序,目前我正在一個活動中監聽和發出套接字事件。

現在,即使聊天活動不在前台,我也想收聽所有套接字事件,因為我想在本地數據庫中存儲來自不同用戶的所有消息,同時我想更新 LiveData 以更新 UI。

為了實現這一點,我在 Application 類中監聽套接字事件,如下所示:

public class ChatApplication extends Application {

public Socket mSocket;
private Map<String, Boolean> receivedFriendEventsMap = new HashMap<>();
private List<Result> friendsList = new ArrayList<>();
private AppDatabase database;

@Override
public void onCreate() {
    super.onCreate();
    try {
        mSocket = IO.socket(Constants.CHAT_SERVER_URL);
        //mSocket.connect();
    } catch (URISyntaxException e) {
        throw new RuntimeException(e);
    }
    Instance = this;
    applicationHandler = new Handler(getInstance().getMainLooper());
    NativeLoader.initNativeLibs(ChatApplication.getInstance());
    //mSocket.connect();
    database = AppDatabase.getDatabase(getApplicationContext());

    mSocket.on("friend_status", new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d(TAG, "" + args[0] + args[1]);
            receivedFriendEventsMap.put((String) args[0], (Boolean) args[1]);
        }
    });

    mSocket.on("listen_friend_message", new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d(TAG, "listen_friend_message: " + (String) args[0] + args[1]);

            SocketMessage socketMessage = new Gson().fromJson((String) args[0], SocketMessage.class);
            //database.socketMessageDao().addMessage(socketMessage);
            mSocket.emit("trigger_friend_message_delivered", socketMessage.getMsg_id(), socketMessage.getSender_id(), socketMessage.getReceiver_id(), args[1]);
        }
    });

    SocketMessage socketMessage = new Gson().fromJson((String) result, SocketMessage.class);
    //database.socketMessageDao().addMessage(socketMessage);
    Log.d(TAG, new Gson().toJson(database.socketMessageDao().getAllMessages(), new TypeToken<List<SocketMessage>>() {
    }.getType()));
}

這是正確的方法嗎? 如果沒有,任何人都可以給我建議一些好的解決方案。 任何幫助表示贊賞。

您需要使用LifeCycleService來連接和監聽套接字,然后使用服務綁定來觀察活動的變化

這是一個連接到套接字的服務類,並具有 MutableLiveData() socketData觀察套接字的連接(您可以創建任何類型的 LiveDataObject 並觀察不活動)

 class SocketService : LifecycleService() {
    val socketData  = MutableLiveData<String>()
    var mSocket: Socket? = null
    private val mBinder = SocketBinder()

    override fun onCreate() {
        super.onCreate()
        mSocket?.let {
            if (!it.connected()) it.connect()
        } ?: run {
            initSocketConnection()
        }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        super.onStartCommand(intent, flags, startId)
        mSocket?.let {
            if (!it.connected()) it.connect()
        } ?: run {
            initSocketConnection()
        }
        return START_NOT_STICKY
    }

    override fun onBind(intent: Intent): IBinder {
        super.onBind(intent)
        return mBinder
    }

    override fun onUnbind(intent: Intent?): Boolean {
        return true
    }

    override fun onRebind(intent: Intent?) {
        super.onRebind(intent)
    }

    private fun initSocketConnection() {
        try {
            val options = IO.Options()
            options.timeout = 5000
            options.transports = arrayOf(WebSocket.NAME)
            mSocket = IO.socket(BuildConfig.SOCKET_SERVER_ADDRESS, options)
            connectSocket()
        } catch (e: URISyntaxException) {
            throw RuntimeException(e)
        }
    }

    private fun connectSocket() {
        mSocket?.let {
            it.connect()
            it.on(Socket.EVENT_CONNECT) {
                connectSocketListener()
                Log.e(SOCKET_TAG, "Connection Successful")
                socketData.postValue(  "Connection Successful for live data")
            }
            it.on(Socket.EVENT_CONNECT_ERROR) { args ->
                Log.e(SOCKET_TAG, "Connection Fail " + args[0].toString())
            }
            it.on(Socket.EVENT_CONNECT_TIMEOUT) { args ->
                Log.e(SOCKET_TAG, "Connection Fail " + args[0].toString())
            }
            it.on(Socket.EVENT_ERROR) { args ->
                Log.e(SOCKET_TAG, "Connection Fail " + args[0].toString())
            }
            it.on(Socket.EVENT_CONNECTING) {}

        }
    }

    override fun onDestroy() {
        super.onDestroy()
        stopSocket()
    }

    private fun stopSocket() {
        mSocket?.let {
            it.disconnect()
            it.off(Socket.EVENT_CONNECT) {}
            it.off(Socket.EVENT_CONNECT_ERROR) {}
            it.off(Socket.EVENT_CONNECT_TIMEOUT) {}
            it.off(Socket.EVENT_ERROR) {}
            it.off(Socket.EVENT_CONNECTING) {}
            disconnectSocketListener()
        }
    }

    private fun connectSocketListener() {

    }

    private fun disconnectSocketListener() {

    }

    inner class SocketBinder : Binder() {
        fun getService(): SocketService = this@SocketService
    }
}

現在在 Activity 中,您需要綁定此服務並監聽 LiveData 對象中的更改

class BaseActivity : AppCompatActivity() {
    private var mService: SocketService? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    private val mConnection = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            mService = (service as SocketService.SocketBinder).getService()
            mService?.let {
                it.socketData.observe(it) { arg ->
                    Log.d(SOCKET_TAG, arg)
                }
            }
        }

        override fun onServiceDisconnected(name: ComponentName?) {

        }
    }

    override fun onStart() {
        super.onStart() 
        val intent = Intent(this, SocketService::class.java)
        bindService(intent, mConnection, BIND_AUTO_CREATE)
       
    }

    override fun onStop() {
        super.onStop()
        try {
            mService?.let {
                unbindService(mConnection)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

您可以看到套接字連接時我在 LiveData 中發布值,當它有界時我正在注冊一個觀察者來監聽數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM