android - 在 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();
}
}
}
}
解决方案
- 不要手动调用 AsyncTask 的方法,它们将被调用。删除
onPostExecute(true);
它会起作用。 - doInBackground() 是从无法编辑视图属性的后台线程调用的。可以从 UI/主线程更改视图。
推荐阅读
- android - Prism Xamarin.Forms monoandroid81 添加对“MonoAndroid”的引用
- android - 可选择在应用中使用 Cloud Firestore
- php - php 和 mongodb - 将结果作为公共数组集合获取
- python-3.x - Python 异常导入问题
- php - Laravel 存储链接不适用于生产
- webpack - 即使在生产模式下构建,VueJS 也会显示“开发模式”消息
- graphql - 尝试在 GraphCMS api 上连接时出现 Gatsby Graphql 问题
- varnish - 在默认端口 6081 上清漆
- ruby - kubeclient create_namespace NoMethodError
- html - NVDA 和 JAWS 在 Textarea 中禁用输入