2012-02-24 21 views
-1

私はアンドロイドにUDPベースのチャットクライアントを構築することについて、学校の割り当てを持っています。さて、私の最初のアイデアは、サービスを開始するアクティビティを作成することでした。サービスはすべてのネットワークとアクティビティをすべての入力と出力を処理します。しかし、問題を発見しました。UDPチャットでアンドロイド

startCommand関数が開始され、socket.receiveを呼び出してネットワークメッセージの受信を開始しようとすると、サービスからサービスへの入力を渡すことができません(入力=ユーザーが送信したいメッセージ)。単にハングし、ANR例外がスローされます。私はそれを縛るだけで(受信が呼び出されないように)、それは魅力のように機能します。

多分私はこの問題に近づいていません。それとも、それはブロッキング受信呼び出しでサービスをバインドするために動作する必要がありますか?

+0

コードを見ずに診断するのは難しいです。私の最初の推測は、サービスのスレッド(メインUIスレッド)でネットワーク機能を実行することです。これによりブロックされ、ANRが取得されます。ネットワークコールは、常に別のスレッド内で実行する必要があります。 –

答えて

1

私はこのようなことを一度やりました。私は、他のデバイスを追跡するために必要なデータを取り出し、asyncTaskに送り込み、基本的にバックグラウンドで接続を継続するRunnableを起動しました。(これでバインディングについて心配する必要はありません)独自のソケット接続をApache MinaまたはNettyを使用して簡単に行うのではなく、 (ホイールを再発明する必要はありません)。バックグラウンドで実行中のセッションからリストまたはキューにデータ転送を渡し、asyncTaskをチェックしてそれに応じてUIを更新するだけであれば、チャットに設定する必要があります。多分これは最善の方法ではないが、それは私のために働いた。これが助けてくれることを願っています。

+0

答えをくれてありがとう、しかし、課題の全体的なポイントはホイールを再発明することです...私は基本的なUDPで動作するようにする必要があります。 – Mockarutan

+0

あなたのソケットがアンドロイドの外で働いているように聞こえます。だからalextscのように私はあなたのサービスの仕方に混乱していると思っています。サービスはスレッドと同じではありません。サービスをバインドしても、受信者用に別のスレッドを作成し、送信するメッセージの新しいスレッドを呼び出す必要があります。つまり、送信者、受信者、およびアクティビティがUIで実行されている3つのスレッドを誰でもいつでも持つことができます。 – shibbybird

+0

AsyncTaskがトリックをしました!答えをありがとう! – Mockarutan

関連する問題