-1
我正試圖在Android上創建一個小型聊天應用程序。我正嘗試從Android向我的服務器發送一些短信。只有創建視圖層次結構的原始線程可以觸摸Android按鈕上的視圖錯誤點擊按鈕
我正在使用的一些知識,我已經在Android開發者發現,我創建了一個新的類的的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()函數,它運行良好(我認爲),直到我寫了一條消息並按發送。事情是我的消息,我寫的是發送到服務器,但在我的應用程序崩潰,它的giveing我這個錯誤:
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);
}
我知道我在這裏做一些奇怪的代碼,但它在做什麼(在某種程度上)我想要什麼,直到它崩潰後,我打'點發送'。
我該如何解決這個錯誤,並阻止它崩潰我的應用程序?
在此先感謝。
瞭解更多信息我將提供。
你會得到這個錯誤,因爲你在後臺線程中設置了不允許在android中使用的值。要設置該值,必須覆蓋onPostExecuted並在其中設置值。 @Override protected void onPostExecute(String s){ super.onPostExecute(s); } – AndroidBeginner
上面的鏈接是我在搜索「CalledFromWrongThreadException」時得到的第一個命中。如果它沒有回答你的問題,你應該做同樣的事情,並閱讀其他百萬個點擊以查看相同的錯誤。 –
@AndroidBeginner感謝您的提示。我會試着看看它是否工作。 – R3muSGFX