You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中WebSocket Service调用报错的解决及替代方案咨询

问题解决与替代方案

一、错误原因及修复步骤

错误根源

你遇到的错误是因为类名冲突:自定义的Service类命名为WebSocketListener,和OkHttp库中的okhttp3.WebSocketListener重名,导致编译器混淆了类型——它把你要启动的Service当成了OkHttp的抽象WebSocketListener类,而这个抽象类没有伴生对象,无法直接作为Intent的组件参数。

另外代码还有两个潜在问题:

  1. Thread.sleep(10000)直接在onStartCommand中调用,会阻塞主线程引发ANR;
  2. 重复初始化了OkHttpClient实例。

修复后的完整代码

1. 重命名Service类并修正逻辑

package com.example.acessibilyapp.service

import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.util.Log
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.WebSocket
import okhttp3.WebSocketListener

// 自定义的WebSocket监听器,避免和Service类名冲突
object SebSocketListener : WebSocketListener() {
    private val TAG = "WebSocketTest"

    override fun onOpen(webSocket: WebSocket, response: Response) {
        super.onOpen(webSocket, response)
        webSocket.send("Android Device Connected")
        Log.d(TAG, "连接已打开")
    }

    override fun onMessage(webSocket: WebSocket, text: String) {
        super.onMessage(webSocket, text)
        Log.d(TAG, "收到消息: $text")
    }

    override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
        super.onClosing(webSocket, code, reason)
        Log.d(TAG, "正在关闭: 码=$code 原因=$reason")
    }

    override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
        super.onClosed(webSocket, code, reason)
        Log.d(TAG, "已关闭: 码=$code 原因=$reason")
    }

    override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
        Log.d(TAG, "连接失败: ${t.message} 响应=$response")
        super.onFailure(webSocket, t, response)
    }
}

// 重命名Service类,避免和OkHttp的WebSocketListener冲突
class WebSocketService : Service() {
    override fun onBind(p0: Intent?): IBinder? = null

    // 只初始化一个OkHttpClient实例
    private val client = OkHttpClient()
    private val websocketURL = "wss://free.blr2.piesocket.com/v3/1?api_key=AiaSdPmM1Aw231s3Yq4eOq6E2mbjeu55N2tgqqcd&notify_self=1"
    private var webSocket: WebSocket? = null

    private fun startWebSocket() {
        // 放到子线程执行,避免阻塞主线程
        Thread {
            val request = Request.Builder()
                .url(websocketURL)
                .build()
            webSocket = client.newWebSocket(request, SebSocketListener)
            // 模拟发送消息,避免长时间阻塞线程
            Thread.sleep(2000)
            webSocket?.send("Hello from Android Service")
        }.start()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        startWebSocket()
        return START_STICKY
    }

    override fun onDestroy() {
        super.onDestroy()
        // 关闭WebSocket连接
        webSocket?.close(1000, "Service销毁")
        // 关闭OkHttpClient的连接池
        client.dispatcher.executorService.shutdown()
    }
}

2. 修正Service调用代码

val serviceIntent = Intent(this, WebSocketService::class.java)
startService(serviceIntent) // 或startForegroundService,根据Android版本适配

二、Android中WebSocket的其他可行方案

1. Android原生WebSocket(Android 10+)

Android 10(API 29)及以上支持java.net.WebSocket,无需第三方库:

import java.net.URI
import java.net.WebSocket
import android.util.Log

fun connectNativeWebSocket() {
    Thread {
        val ws = WebSocket.connectToServer(object : WebSocket.Listener {
            override fun onOpen(webSocket: WebSocket?) {
                webSocket?.send("Native WebSocket Connected")
            }

            override fun onText(message: String?) {
                Log.d("NativeWS", "收到消息: $message")
            }

            override fun onClose(statusCode: Int, reason: String?) {
                Log.d("NativeWS", "关闭: $statusCode $reason")
            }

            override fun onError(error: Exception?) {
                Log.e("NativeWS", "错误: ${error?.message}")
            }
        }, URI.create("wss://your-websocket-url"))
    }.start()
}

2. Java-WebSocket第三方库

这是一个轻量级的WebSocket客户端库,兼容低版本Android:

  • 先添加依赖:
implementation "org.java-websocket:Java-WebSocket:1.5.6"
  • 使用示例:
import org.java_websocket.client.WebSocketClient
import org.java_websocket.handshake.ServerHandshake
import java.net.URI
import android.util.Log

fun connectJavaWebSocket() {
    val client = object : WebSocketClient(URI.create("wss://your-websocket-url")) {
        override fun onOpen(handshakedata: ServerHandshake?) {
            send("Java-WebSocket Connected")
        }

        override fun onMessage(message: String?) {
            Log.d("JavaWS", "收到消息: $message")
        }

        override fun onClose(code: Int, reason: String?, remote: Boolean) {
            Log.d("JavaWS", "关闭: $code $reason")
        }

        override fun onError(ex: Exception?) {
            Log.e("JavaWS", "错误: ${ex?.message}")
        }
    }
    client.connect()
}

3. RxWebSocket(基于RxJava)

适合已经使用RxJava的项目,支持流式处理WebSocket消息:

  • 添加依赖(需配合RxJava3):
implementation "com.github.trello:rxlifecycle:3.1.0"
implementation "com.github.huangjianfeng:RxWebSocket:1.0.6"
  • 使用示例:
import com.hjf.rxwebsocket.RxWebSocket
import android.util.Log

fun connectRxWebSocket() {
    RxWebSocket.builder("wss://your-websocket-url")
        .connect()
        .subscribe({ message ->
            Log.d("RxWS", "收到消息: ${message.text}")
        }, { error ->
            Log.e("RxWS", "错误: ${error.message}")
        })
}

内容的提问来源于stack exchange,提问作者EpicAdidash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 07:27:50