首页 > 解决方案 > 在 Asynctask android 中使用 socket.io

问题描述

我用socket.io做了一个简单的游戏。它执行得很好,但是当像 textview 这样更改 UI 视图时,它会调用线程错误。所以,我决定在 socket.on 函数时使用 AsyncTask。但在套接字事件到来之前,onPostExecute 已经完成。我怎么能做到这一点?

这是我的代码

 private class JoinAsync extends AsyncTask<Void,Void,Boolean> {
    Boolean isDone = false;
    JSONObject object;
    @Override
    protected Boolean doInBackground(Void... voids) {
        socket.on("join", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                object = (JSONObject)args[0];
                isDone = true;
                onPostExecute(true);
            }
        });
        return false;
    }
    @Override
    protected void onPostExecute(Boolean done) {
        if (done) {
            btnPlay.setEnabled(true);
            turnChanged();
            try {
                playertwoinfo.setText(object.get("nickname").toString() + "\n" + object.get("win").toString() + "승 " + object.get("lose").toString() + "패");
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

标签: androidandroid-asynctasksocket.io

解决方案


  1. 不要手动调用 AsyncTask 的方法,它们将被调用。删除onPostExecute(true);它会起作用。
  2. doInBackground() 是从无法编辑视图属性的后台线程调用的。可以从 UI/主线程更改视图。

推荐阅读