2017-01-29 20 views
-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); 
    } 

我知道我在這裏做一些奇怪的代碼,但它在做什麼(在某種程度上)我想要什麼,直到它崩潰後,我打'點發送'。

我該如何解決這個錯誤,並阻止它崩潰我的應用程序?

在此先感謝。

瞭解更多信息我將提供。

+0

你會得到這個錯誤,因爲你在後臺線程中設置了不允許在android中使用的值。要設置該值,必須覆蓋onPostExecuted並在其中設置值。 @Override protected void onPostExecute(String s){ super.onPostExecute(s); } – AndroidBeginner

+0

上面的鏈接是我在搜索「CalledFromWrongThreadException」時得到的第一個命中。如果它沒有回答你的問題,你應該做同樣的事情,並閱讀其他百萬個點擊以查看相同的錯誤。 –

+0

@AndroidBeginner感謝您的提示。我會試着看看它是否工作。 – R3muSGFX

回答

2

正如錯誤所說,只有UIThread可以對UI進行更改,在本例中爲TextView。你可以使用這個answer來調用sendTextToSend

相關問題