Fragment method and socket.io



我有一个方法,这个方法在片段中更新数组列表。我可以在主活动中像这样调用这个方法

public void getFromUser(String message) {
    addMessageToFragment("ok");
}
public void addMessageToFragment(String message) {
    Log.w("Step 1",message);
    frgObj.addMessageToList("asd");
}

getFromUser正在从片段调用(当用户按下按钮时)这也是有效的。但是我用的是socket。当我尝试从socket调用这个方法时。

public void on(String event, IOAcknowledge ack, Object... args) {
     try{
          addMessageToFragment("ok");
      } catch (JSONException e) {}
}

当这个回调函数调用时,应用程序给出以下错误:

08-19 11:57:24.813: W/System.err(4962): io.socket.SocketIOException: Exception was thrown in on(String, JSONObject[]).
08-19 11:57:24.813: W/System.err(4962): Message was: 5:::{"name":"listele","args":[{"mesaj":"123","gonderen":"781722165-tolgay007-DKSMIcIYGahPuKXriM83","alici":"tolgay007","blck_id":"781722165-tolgay007","out_username":"Anony-781722","ars_status":1,"longinf":"3aqghef","a_status":1}]}
08-19 11:57:24.813: W/System.err(4962):     at io.socket.IOConnection.transportMessage(IOConnection.java:702)
08-19 11:57:24.813: W/System.err(4962):     at io.socket.WebsocketTransport.onMessage(WebsocketTransport.java:82)
08-19 11:57:24.813: W/System.err(4962):     at org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:361)
08-19 11:57:24.813: W/System.err(4962):     at org.java_websocket.WebSocketImpl.deliverMessage(WebSocketImpl.java:565)
08-19 11:57:24.813: W/System.err(4962):     at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:331)
08-19 11:57:24.813: W/System.err(4962):     at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:152)
08-19 11:57:24.813: W/System.err(4962):     at org.java_websocket.client.WebSocketClient.interruptableRun(WebSocketClient.java:247)
08-19 11:57:24.823: W/System.err(4962):     at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:193)
08-19 11:57:24.823: W/System.err(4962):     at java.lang.Thread.run(Thread.java:841)
08-19 11:57:24.823: W/System.err(4962): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:2800)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:650)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:650)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:650)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:650)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:650)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:650)
08-19 11:57:24.823: W/System.err(4962):     at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:650)
08-19 11:57:24.823: W/System.err(4962):     at android.view.View.setFlags(View.java:8878)
08-19 11:57:24.823: W/System.err(4962):     at android.view.View.setFocusableInTouchMode(View.java:6114)
08-19 11:57:24.823: W/System.err(4962):     at android.widget.AdapterView.checkFocus(AdapterView.java:718)
08-19 11:57:24.823: W/System.err(4962):     at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:813)
08-19 11:57:24.823: W/System.err(4962):     at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:6280)
08-19 11:57:24.823: W/System.err(4962):     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
08-19 11:57:24.823: W/System.err(4962):     at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
08-19 11:57:24.823: W/System.err(4962):     at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286)
08-19 11:57:24.823: W/System.err(4962):     at com.impact.ribony.ConversationFragment.addMessageToList(ConversationFragment.java:91)
08-19 11:57:24.823: W/System.err(4962):     at com.impact.ribony.MainActivity.addMessageToFragment(MainActivity.java:344)
08-19 11:57:24.823: W/System.err(4962):     at com.impact.ribony.MainActivity$2.on(MainActivity.java:183)
08-19 11:57:24.823: W/System.err(4962):     at io.socket.IOConnection.on(IOConnection.java:908)
08-19 11:57:24.883: W/System.err(4962):     at io.socket.IOConnection.transportMessage(IOConnection.java:697)

我不明白这个错误。是什么原因导致这个错误?

SocketIO方法

public void on(String event, IOAcknowledge ack, Object... args)

不会在主线程中被调用,并且只有主线程允许修改视图。正如在你的堆栈跟踪行

中提到的
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

所以你必须包装你的frgObj.addMessageToList("asd");与

的电话
 view.post(...);

 activity.runOnUIThread(...)

不使它崩溃

编辑:

或者如果你没有活动或视图

 Handler uiThreadHandler = new Handler(Looper.getMainLooper());
 uiThreadHandler.post(new Runnable()
     {
        public void run()
        {
            frgObj.addMessageToList("asd");
        }
     } );

最新更新