- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一些小型聊天应用程序,并且我正在使用 AndroidAsync 在我的应用程序中获取 WebSocket 客户端功能。所以,问题是每当我尝试从 WebSocket.StringCallback().onStringAvailable(String)
修改我的 listView 时,它都会导致异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
at android.view.ViewRoot.focusableViewAvailable(ViewRoot.java:1712)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:452)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:452)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:452)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:452)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:452)
at android.view.View.setFlags(View.java:4614)
at android.view.View.setFocusableInTouchMode(View.java:3190)
at android.widget.AdapterView.checkFocus(AdapterView.java:694)
at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:789)
at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:31)
at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:247)
at persilabtest.zulfigarov.com.chatapp.ChatActivity$1$1.onStringAvailable(ChatActivity.java:76)
at com.koushikdutta.async.http.WebSocketImpl$1.onMessage(WebSocketImpl.java:88)
at com.koushikdutta.async.http.HybiParser.emitFrame(HybiParser.java:420)
at com.koushikdutta.async.http.HybiParser.access$800(HybiParser.java:46)
at com.koushikdutta.async.http.HybiParser$5.onDataAvailable(HybiParser.java:197)
at com.koushikdutta.async.DataEmitterReader.handlePendingData(DataEmitterReader.java:24)
at com.koushikdutta.async.DataEmitterReader.onDataAvailable(DataEmitterReader.java:41)
at com.koushikdutta.async.Util.emitAllData(Util.java:22)
at com.koushikdutta.async.AsyncNetworkSocket.onReadable(AsyncNetworkSocket.java:146)
at com.koushikdutta.async.AsyncServer.runLoop(AsyncServer.java:788)
at com.koushikdutta.async.AsyncServer.run(AsyncServer.java:626)
at com.koushikdutta.async.AsyncServer.access$700(AsyncServer.java:41)
at com.koushikdutta.async.AsyncServer$13.run(AsyncServer.java:568)
我已经明白我无法从非 UI 线程修改 View 。但我不知道在这种情况下我还能如何更新它们。这是我的 ChatActivity 代码:
public class ChatActivity extends ActionBarActivity
{
private static final String WS_ADDRESS = "ws://192.168.0.106:8084/TestChatServer/chat";
@InjectView(R.id.btnSend)
Button btnSend;
@InjectView(R.id.lvChat)
ListView lvChat;
@InjectView(R.id.etMsg)
EditText etMsg;
List<String> mMessages = new ArrayList<String>();
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
ButterKnife.inject(this);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMessages);
lvChat.setAdapter(adapter);
AsyncHttpClient.getDefaultInstance()
.websocket(WS_ADDRESS, null, new AsyncHttpClient.WebSocketConnectCallback()
{
@Override
public void onCompleted(Exception ex, WebSocket webSocket)
{
if (ex != null)
{
ex.printStackTrace();
return;
}
Log.d("myLogs", "OK");
webSocket.setStringCallback(new WebSocket.StringCallback()
{
@Override
public void onStringAvailable(String s)
{
String newStr = s.replaceAll("(#+\\S+)", "<font color='#EE0000'>$1</font>");
Log.d("myLogs", s + "\n" + newStr);
mMessages.add(newStr);
//This line causes the exception
adapter.notifyDataSetChanged();
}
});
}
});
}
}
那么,有什么想法如何让我的 listView 在每次发送新消息时更新吗?
最佳答案
您需要确保从 UI 线程更新 View 。您可以使用 Activity.runOnUiThread() 来完成此操作像这样:
runOnUiThread(new Runnable() {
@Override
public void run() {
//run your code that needs to update the UI here
}
});
此错误的原因只有创建 View 层次结构的原始线程才能触摸其 View
是因为它检测到另一个线程(除了创建 View 的线程之外)正在尝试触摸 View 。如果多个资源尝试同时更改某项内容,则会导致线程问题。
关于java - AndroidAsync - 从 WebSocket.StringCallback() 更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28151748/
我正在使用 AndroidAsync koush 低级网络协议(protocol)库。我正在使用 WebSocket 连接到服务器。我能够连接、发送/接收消息和断开连接。我的断开连接时间很长。服务器平
我正在使用这个 AndroidSync koush 的库,用于创建 websocket(服务器/客户端)并在两个 android 设备之间传输数据。这两个设备通过 wifi 连接(一个是 Wifi A
我正在尝试更改默认的 AndroidAsync websocket 初始连接超时 30 秒。这是具有默认超时的工作版本: AsyncHttpClient.getDefaultInstance().we
我已经在 Android 上使用 socket.io 几天了。截至目前,我正在使用 Koush 的 AndroidAsync。当我尝试连接到本地 socket.io 服务器 (http://192.1
我尝试使用 AndroidAsync 库。这是一个代码示例: AsyncHttpClient.getDefaultInstance() .websocket(url,
我正在编写一些小型聊天应用程序,并且我正在使用 AndroidAsync 在我的应用程序中获取 WebSocket 客户端功能。所以,问题是每当我尝试从 WebSocket.StringCallbac
我正在寻找有关如何使用 AndroidAsync 库创建简单套接字或 DatagramSocket 的示例。 git repo 中的示例、测试和主页上的示例似乎并未涵盖此用例。我看到了 SocketC
我将 Koush 的 AndroidAsync 用于 WebSocket 客户端。我的代码遵循 https://github.com/koush/AndroidAsync 处的示例和作品。 (下面复制
我是一名优秀的程序员,十分优秀!