![](/img/trans.png)
[英]Could not resolve android.arch.lifecycle:livedata:1.1.1 Android Studio 3.6.1 Mac
[英]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.