1

私は Android 開発と Java に不慣れで、誰かが次のことを手伝ってくれるかどうか疑問に思っていました:

指定されたポートでリッスンするサーバー スレッドを実行するアプリケーションを作成しました。接続されたクライアントから受信したメッセージをアクティビティの TextView に出力したいと思います。

サーバー スレッドは別のクラスにあります。このクラスの run メソッドは、クライアント接続をリッスンし、受信したデータを String に読み取ります。

TextView を更新できるように、この文字列の内容をアクティビティに転送する最良の方法は何でしょうか?

私の(限られた)理解から、UIスレッドのみがTextViewを更新する必要があり、runOnUiThreadを取得してTextViewを更新する方法が見つかりません。

リクエストに応じてコードを追加しました。

活動コード:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TextView messages = (TextView) findViewById(R.id.messages);

    try {
        newThread server = new newThread(this, messages);
    } catch(Exception e) {
        Toast.makeText(ChatActivity.this, e.toString(), Toast.LENGTH_LONG).show();
    }

}

newThread クラスでメソッドを実行します。

public void run()
{
    serv = new ServerSocket(8000);
    while(true)
    {
        cli = serv.accept();
        user = cli.getInetAddress().toString();
        BufferedReader cli_in = new BufferedReader(new InputStreamReader(cli.getInputStream()));
        OutputStreamWriter cli_out = new OutputStreamWriter(cli.getOutputStream());

        while((buf = cli_in.readLine()) != null)
        {
            // Update the messages TextView with buf 
        }

     }
}

雑然としすぎないように、関係のないコードは可能な限り省略しました。

基本的に、run() の内側の while ループでは、「buf」文字列をアクティビティに渡して、メッセージのテキストビューをそのコンテンツで更新できるようにしたいと考えています。

乾杯

4

1 に答える 1

0

悪い考えかもしれませんが、AsyncTaskを使用するのはどうですか?これが機能するかどうかは試しませんでしたが、onProgressUpdateがUIスレッドにアクセスできるため、機能する可能性があります。

private TextView messages;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    messages = (TextView) findViewById(R.id.messages);

    ReceiveTask receive = new ReceiveTask();
    receive.execute(100)
    }
private void updateTextView(String text)
    {
            messages.setText(text);
    }
    private class ReceiveTask extends AsyncTask<Integer, String, Long> {

    @Override
    protected void onPreExecute() {

    }

    protected Long doInBackground(Integer... urls) {
        newThread nt = new newThread();
        while(true)
        {
            publishProgress(run());
        }
        return (long)0;
    }

    protected void onProgressUpdate(String... value) {
        updateTextView(value[0]); //method in Activity class, to update TextView
    }

    protected void onPostExecute(Long result) {

        }
    }

基本的publishProgressにはにデータを送信しonProgressUpdate、次にメインクラスのメソッド(updateTextView)にデータを送信し、TextViewを更新します。

通常、チャットに取り組んでいることを他の人に伝えると役立ちます。また、run()を変更して文字列を返し、while(true)ループを削除する必要があります。これは最善のアイデアではありません。最初にAndroidチャットを作成する方法についていくつかのチュートリアルを実行することをお勧めします。

于 2012-04-22T16:10:04.113 に答える