【问题标题】:how to retrive data from socket io in listview in android如何在android的listview中从socket io中检索数据
【发布时间】:2013-11-08 12:35:01
【问题描述】:

我正在使用 socket-io 制作 android 应用程序,所有数据通过 socket-io 从服务器检索到 android 应用程序,并且这些数据应该在 listview 中格式化。但是在arrayadapter中加载数据存在问题。我的 MainActivity.class 是

public class MainActivity extends Activity {

ListView list;
String[] namesArr ;


ArrayList<String> mylist = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    helper = new databasehelper(this);

        list = (ListView)findViewById(R.id.newslist);

      SocketIO socket = null;
        try {

            socket = new SocketIO("http://**************/");

            //socket = new SocketIO("http://localhost:7010/");



        } catch (MalformedURLException e1) {

            e1.printStackTrace();
        }
        socket.connect(new IOCallback() {

            @Override
            public void onMessage(JSONObject json, IOAcknowledge ack) {
                try {
                    System.out.println("Server said:" + json.toString(2));

                 //   Log.d("json",""+json);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onMessage(String data, IOAcknowledge ack) {
                System.out.println("Server said: " + data);

             //   Log.d("json",""+ data);
            }

            @Override
            public void onError(SocketIOException socketIOException) {
                System.out.println("an Error occured");
                socketIOException.printStackTrace();
            }

            @Override
            public void onDisconnect() {
                System.out.println("Connection terminated.");
            }

            @Override
            public void onConnect() {
                System.out.println("Connection established");
            }

            @Override
            public void on(String event, IOAcknowledge ack, Object... args) {
                System.out.println("Server triggered event '" + event + "'");
            }

            @Override
            public void onMessage(JSONArray args,IOAcknowledge remoteAcknowledge) {
                // TODO Auto-generated method stub

                Log.d("main", ""+args);

                try {
                        JSONArray object = args.getJSONArray(0);
                        Log.d("object",""+object);

                        for(int n = 0; n < object.length(); n++)
                        {
                            String ob2 = object.getString(n);
                            Log.d("ob2",""+ob2);

                            //String[] myarray = new String[n];

                            mylist.add(ob2);
                        }

                        Log.d("arraylist",""+mylist);

                        namesArr = new String[mylist.size()];
                        for (int i = 0; i < mylist.size(); i++) {
                            namesArr[i] =  mylist.get(i);


                            Log.d("string array element",namesArr[i]);

                        }





                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }               
            }

        });

        // This line is cached until the connection is establisched.
        socket.send("Hello Server!"); 
            display(mylist);
        }   
  private void display(ArrayList<String> mylist) {
    // TODO Auto-generated method stub

    ArrayAdapter<String> aa = new ArrayAdapter<String> getApplicationContext(),android.R.layout.simple_list_item_1,mylist);

      Log.d("real Arraylist",""+mylist);

      //Log.d("array adapter",aa.toString());

     // list.setAdapter(aa);
}
   }

我得到类似这样的错误

11-08 07:09:24.783: W/System.err(5775):     at com.mayur.socketio.IOConnection.transportMessage(IOConnection.java:703)
11-08 07:09:24.792: W/System.err(5775):     at com.mayur.socketio.WebsocketTransport.onMessage(WebsocketTransport.java:82)
11-08 07:09:24.814: W/System.err(5775):     at org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:361)
11-08 07:09:24.814: W/System.err(5775):     at org.java_websocket.WebSocketImpl.deliverMessage(WebSocketImpl.java:565)
11-08 07:09:24.823: W/System.err(5775):     at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:331)
11-08 07:09:24.823: W/System.err(5775):     at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:152)
11-08 07:09:24.823: W/System.err(5775):     at org.java_websocket.client.WebSocketClient.interruptableRun(WebSocketClient.java:247)
11-08 07:09:24.823: W/System.err(5775):     at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:193)
11-08 07:09:24.823: W/System.err(5775):     at java.lang.Thread.run(Thread.java:841)
11-08 07:09:24.832: W/System.err(5775): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
11-08 07:09:24.882: W/System.err(5775):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5908)
11-08 07:09:24.882: W/System.err(5775):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:837)
11-08 07:09:24.893: W/System.err(5775):     at android.view.View.requestLayout(View.java:15792)
11-08 07:09:24.893: W/System.err(5775):     at android.view.View.requestLayout(View.java:15792)
11-08 07:09:24.893: W/System.err(5775):     at android.view.View.requestLayout(View.java:15792)
11-08 07:09:24.904: W/System.err(5775):     at android.view.View.requestLayout(View.java:15792)
11-08 07:09:24.904: W/System.err(5775):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:358)
11-08 07:09:24.913: W/System.err(5775):     at android.view.View.requestLayout(View.java:15792)
11-08 07:09:24.913: W/System.err(5775):     at android.widget.AbsListView.requestLayout(AbsListView.java:1837)
11-08 07:09:24.933: W/System.err(5775):     at android.widget.ListView.setAdapter(ListView.java:491)
11-08 07:09:24.933: W/System.err(5775):     at com.mayur.socketio.MainActivity$1.onMessage(MainActivity.java:147)
11-08 07:09:24.943: W/System.err(5775):     at com.mayur.socketio.IOConnection.onMessage(IOConnection.java:937)
11-08 07:09:24.943: W/System.err(5775):     at com.mayur.socketio.IOConnection.transportMessage(IOConnection.java:698)

请告诉我我的代码有什么问题以及解决方案是什么??? 提前致谢

【问题讨论】:

    标签: android sockets listview arraylist


    【解决方案1】:

    错误是您在工作线程中设置了适配器。您只能从主线程更新视图。所以替换

    list.setAdapter(dataAdapter);
    

    runOnUiThread(new Runnable() {
       @Override
       public void run() {
           list.setAdapter(dataAdapter);
       }
    });
    

    【讨论】:

      【解决方案2】:

      您必须将更新 ui 的后台任务部分移动到主线程上。有一段简单的代码:

      runOnUiThread(new Runnable() {
           public void run() {
      
      //stuff that updates ui
      
          }
      });
      

      参考:Only the original thread that created a view hierarchy can touch its views.”

      希望这会有所帮助。 :)

      【讨论】:

        猜你喜欢
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 2022-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多