I am making android app using socket-io all data retrived from server through socket-io to android app and this data should format in listview. But there are problem for loading data in arrayadapter. My MainActivity.class is
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);
}
}
and i get error something like this
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)
Please suggest me what is problem in my code and what is solution??? Thanks in advance
Error is that you set adapter in working thread. You can update views only from main thread. So replace
list.setAdapter(dataAdapter);
with
runOnUiThread(new Runnable() {
@Override
public void run() {
list.setAdapter(dataAdapter);
}
});