【发布时间】:2016-04-28 01:31:55
【问题描述】:
W/System.err: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这是我的问题。我正在尝试创建一个聊天,因为我正在使用 RecyclerView 和套接字,请记住我必须使用套接字(作业的一部分)。所以我打开一个连接并启动一个线程来监听服务器,每当任何聊天参与者发送一条消息时,它都会向我发送一条消息。我正在使用连接到服务器的 AsyncTask,因为我无法在主线程上执行连接。
最后我做了某种递归,连接到服务器,等待一个消息,断开连接,执行一个 onPostExecute 来改变它并再次调用 AsyncTask。
问题是 adapter.notifyDataSetChanged();没有做我预期的事情,我的 RecyclerView 上的 itens 没有改变,或者当它再次加载所有 Recycler 时。
我有活动的onCreate,它有正常的东西+ Recyclye初始化器,然后我调用:
private void conAtualizer() {
latch = new CountDownLatch(1);
Thread Thread = new HandlerThread("Handler") {
@Override
public void run() {
try {
Socket socketMsg = Conection.persistentConect();
DataOutputStream outToServer =
new DataOutputStream(socketMsg.getOutputStream());
BufferedReader servidorAnsw =
new BufferedReader(new
InputStreamReader(socketMsg.getInputStream()));
outToServer.writeBytes("406" + '\n' +
getIntent().getStringExtra("LOGED_ID")+"\n"+
getIntent().getStringExtra("TARGET_ID") + '\n');
newMsg=false;
while(active){
if(servidorAnsw.ready()){
if(servidorAnsw.readLine().equals("406")){
MetaMessage thisMetaMessage =
new MetaMessage(servidorAnsw.readLine());
menssages.add(thisMetaMessage);
newMsg=true;
}
}
}
outToServer.writeBytes("close\n");
latch.countDown();
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
Thread.start();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
还有通知:
public class NotConv extends AsyncTask <String,Void,MetaMnssage>{
@Override
protected MetaMessage doInBackground(String... params) {
while(!newMsg){
}
if(ative){
adapter.notifyDataSetChanged();
}
return null;
}
protected void onPostExecute(MetaMessage thisMetaMessage) {
newMsg=false;
new NotConv().execute("");
}
}
【问题讨论】:
-
你应该使用
runOnUIThread。 -
我无法在主线程上执行连接。
runOnUIThread在主线程上运行。 -
您应该在此处发布您的代码,以便every1 可以提供帮助。
-
好的,我已经编辑了主帖
标签: java android multithreading sockets android-asynctask