【相談】TCP接続に失敗するとアプリケーションが固まってしまいます

351 views
Skip to first unread message

ゅぅゃ

unread,
Mar 3, 2011, 1:28:43 AM3/3/11
to 日本Androidの会
もしかしたらJava的な問題かもしれませんが相談です。
TCP接続のタイムアウト後、アプリケーションが固まってしまい、強制終了します。

全体的な流れとしては、Actiivity1からActivity2を起動
Activity2のonResume内で受信用スレッドを立て、
その中でソケットのコネクションと受信ループを回しています。
コネクションに失敗したcatch{}処でにfinish()を呼んでアクティビティを終了しようと思いますが、
onPause、onStop、onDestroyが呼ばれていません。
LogCatには
「Activity destroy timeout fo HistoryRecord{}」
などが表示されます。
画面だけはActivity1に戻されますが、その後Activityが反応せずにアプリケーションが落ちてしまいます。

以下、部分的な簡易ソースです。

@Override
protected void onResume() {
super.onResume();
Log.v("RESUME", "onResume was called.");

//接続&受信ループスレッド起動
(new Thread() {public void run() {
tcp_connect();

}}).start();

while (コネクションするまで待つ) {
}

//送信ループスレッド起動
(new Thread() {public void run() {
tcp_send_loop();
}}).start();

}

//接続
private void tcp_connect() {
socket = new Socket();

try {
InetSocketAddress srvaddr;
srvaddr = new InetSocketAddress(InetAddress.getByName(ip),
port);
socket.connect(srvaddr, 5000); //5秒のタイムアウト設定
} catch (Exception err) {
//コネクションタイムアウトした場合の処理
finish(); //当問題の発生場所
return;
}

while (受信ループ) {
//受信処理
}
}
}


ちなみに、受信処理において-1(DISCONNECT)を受信後にfinish()を呼んだ場合は、
onPause、onStop、onDestroyが呼ばれてちゃんと全画面に戻ります。
この違いがわかりません。

connect処理で失敗した後、フレームワークが死んでしまって、finish()に対する応答がないような感じがしますが、
解決方法、回避方法はありませんでしょうか?

sakamoto toshiyuki

unread,
Mar 5, 2011, 8:58:47 PM3/5/11
to android-g...@googlegroups.com
坂本といいます。こんにちは。

finish()をスレッドの中で呼んでいるようですが、AndroidのUI処理はシングルスレッドモデルなので、Handler等を使用してUIスレッドの中で呼び出さなければならないかと。


それでは


2011年3月3日15:28 ゅぅゃ <yuya...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

Reply all
Reply to author
Forward
0 new messages