저는 작은 채팅 응용 프로그램을 작성했으며 AndroidAsync을 사용하여 응용 프로그램에서 WebSocket 클라이언트 기능을 사용하고 있습니다. 이미 나는 비 UI 스레드에서보기를 수정할 수 있음을 이해 한AndroidAsync - WebSocket.StringCallback()에서보기 업데이트
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)
: 나는 예외가 발생 WebSocket.StringCallback().onStringAvailable(String)
에서 내 목록보기를 수정하려고 할 때마다 그래서 문제입니다. 그러나 나는이 상황에서 내가 어떻게 그들을 업데이트 할 수 있는지 모른다.
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();
}
});
}
});
}
}
그래서, 내가 때마다 업데이트 내 목록보기를 얻을 수있는 방법 어떤 아이디어가 새로운 메시지 전달 : 여기 내 ChatActivity 코드입니까?
가능한 중복 (HTTP : // 유래 .com/questions/5161951/android-only-the-original-thread-that-created-a-view-hierarchy-its-vi) –