2017-01-29 9 views
-1

私はAndroid上で小さなチャットアプリを作ろうとしています。私はAndroidからPC上の私のサーバーにいくつかのテキストメッセージを送信しようとしています。ビューの階層を作成した元のスレッドだけがビューに触れることができます。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()関数を呼び出し、それは私がメッセージを書いてsendを押すまでうまくいっていると思います。事は、私が書いた私のメッセージはサーバーにオーバー送られますが、私のアプリケーションがクラッシュし、それは私にこのエラーを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

アンドロイドで許可されていないバックグラウンドスレッドでvauleを設定しているため、このエラーが発生しています。値を設定するには、onPostExecutedをオーバーライドして値を設定する必要があります。 @Override protected void onPostExecute(String s){ super.onPostExecute(s); } – AndroidBeginner

+0

上記のリンクは、 "CalledFromWrongThreadException"を検索したときの最初のヒットです。それがあなたの質問に答えることができないならば、あなたは同じことをして、同じエラーの百万の他のヒットを読むべきです。 –

+0

@AndroidBeginnerに感謝します。私はそれが動作しているかどうかを確認するためにこれを試します。 – R3muSGFX

答えて

2

エラーが言うように、唯一のUIThreadが、この場合のUIの変更、のTextViewを行うことができます。このanswerを使用してsendTextToSendを呼び出すことができます

関連する問題