我正试着在Android上做一个小聊天应用。我正在尝试从Android向PC上的服务器发送一些文本消息。
我正在使用我在安卓开发人员中找到的一些知识,并为AsyncTask创建了一个新类:
public class ChatTask extends AsyncTask<Void, Void, Void>
{
private BufferedReader in;
private PrintWriter out;
@Override
protected Void doInBackground(Void... voids)
{
try
{
startClient();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
// Chat start method
private void startClient() throws IOException
{
Socket socket = new Socket(ipAddress, 9001);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
writeText("Conectat la serverul: " + ipAddress);
while (true)
{
String line = in.readLine();
if (line.startsWith("SUBMITNAME"))
{
out.println(name);
}
else if (line.startsWith("NAMEACCEPTED"))
{
}
else if (line.startsWith("MESSAGE"))
{
writeText(line.substring(8) + "\n");
}
}
}
// Write to TextView
private void writeText(String text)
{
ChatActivity.setsTextToSend(text + "\n");
}
// Write to server
public void sendTextToServer(final String text)
{
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
out.println(text + "\n");;
}
});
thread.start();
}}
然后,我将任务与我的主要活动联系起来。我调用了Task.execute()函数,它工作得很好(我认为),直到我写了一条消息并按下send。问题是我写的消息被发送到服务器,但是我的应用程序崩溃了,它给了我这个错误:
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: ro.remus.messenger, PID: 3460
java.lang.RuntimeException: An error occurred while executing doInBackground()
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at ro.remus.messenger.ChatActivity.writeTo(ChatActivity.java:90)
at ro.remus.messenger.ChatActivity.setsTextToSend(ChatActivity.java:26)
at ro.remus.messenger.ChatTask.writeText(ChatTask.java:70)
at ro.remus.messenger.ChatTask.startClient(ChatTask.java:62)
at ro.remus.messenger.ChatTask.doInBackground(ChatTask.java:29)
at ro.remus.messenger.ChatTask.doInBackground(ChatTask.java:15)我没有发布整个错误,因为这是不相关的
在错误持续显示的主活动中,我的代码是:
btnSend.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
chatTask.sendTextToServer(getsTextToSend());
}
});
//textToSend.setText("");
}
});
private static void writeTo(String text)
{
tvReceivedText.append(text);
}我知道我在这里做了一些奇怪的代码,但它(不知何故)正在做我想要的事情,直到我点击'Send‘后它崩溃。
我如何修复这个错误并阻止它使我的应用程序崩溃?
提前谢谢。
更多的信息,是需要我会提供。
发布于 2017-01-30 03:55:30
正如错误所说,只有UIThread可以对UI进行更改,在本例中是TextView。您可以使用此answer调用sendTextToSend
https://stackoverflow.com/questions/41925198
复制相似问题