【问题标题】:Unable to send data from doInBackground method of AsyncTask via Websocket无法通过 Websocket 从 AsyncTask 的 doInBackground 方法发送数据
【发布时间】:2017-11-10 10:13:23
【问题描述】:

我正在尝试通过 websocket 发送数据并接收相同的回声。当我尝试通过后台线程发送它时,我没有收到回声。有什么问题?通过后台线程发送数据是否不正确?如果有,为什么?

请检查我的代码以及随附的相关日志。

private final class EchoWebSocketListener extends WebSocketListener  {
    private static final int NORMAL_CLOSURE_STATUS = 1000;

    @Override
    public void onOpen(final WebSocket webSocket, Response response) {

        class SendData extends AsyncTask {

            @Override
            protected void onPreExecute(){
                Log.d("Websocket","In Pre-execute");
                webSocket.send("In pre-execute");
            }

            @Override
            protected Object doInBackground(Object[] objects) {
                Log.d("AsyncTask","In doInBackground");
                //The below statement receives no echo
                webSocket.send("doInBackground");
                Log.d("AsyncTask","In END of doInBackground");
                return null;
            }
        }

        new SendData().execute();
        webSocket.send(ByteString.decodeHex("1245"));
        webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        Log.i("Receiving : ",text);
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        Log.i("Receiving bytes : " , bytes.hex());
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        webSocket.close(NORMAL_CLOSURE_STATUS, null);
        Log.i("Closing : " , code + " / " + reason);
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        Log.i("Error", "Error in WebsocketEcho");
    }
}

日志:

D/AsyncTask: In Pre-execute
D/AsyncTask: In doInBackground
D/AsyncTask: In END of doInBackground
I/Receiving :: In pre-execute
I/Receiving bytes :: 1245
I/Closing :: 1000 / Goodbye !

【问题讨论】:

  • 为什么在后台线程中使用套接字?
  • 我正在尝试从后台运行的某个源中获取一些数据并通过 webSocket 发送。如果我尝试在主线程上执行此操作,则会收到一条错误消息,提示帧太多,跳过了一些帧。运行时我不需要在屏幕上显示任何内容,因此我想我可以尝试在后台执行此操作。如果我错了,请纠正我
  • 好友获取数据后通过异步任务获取数据,然后使用它并将其提供给套接字

标签: android multithreading websocket android-asynctask java-websocket


【解决方案1】:

完成后关闭线程的异步任务。因此,随着 AsyncTask 的完成,您的套接字所在的线程将被关闭。在 asyncTask 之外使用你的套接字然后它就会工作。更多细节请研究异步任务和线程池执行器的执行。

您可以在此处找到更多详细信息:

https://developer.android.com/reference/android/os/AsyncTask.html

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2021-06-24
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多