gpt4 book ai didi

android - 如何从android中的listview中的socket io检索数据

转载 作者:行者123 更新时间:2023-11-30 03:17:09 26 4
gpt4 key购买 nike

我正在使用 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)

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

最佳答案

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

list.setAdapter(dataAdapter);

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

关于android - 如何从android中的listview中的socket io检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com