私の Android アプリケーションは、スレッドを使用して、USB 経由で接続された PC からのソケット接続をリッスンします。PCが接続を開いた後のある時点で(ユーザー主導のイベントに応答して)、データを送信したいと思います。
public void onCreate(Bundle savedInstanceState) {
// SNIP: stuff and nonsense
connection = new Thread(new ServerThread());
connection.start();
}
public boolean onTouchEvent(MotionEvent event) {
// SNIP: decide what to do; create string 'coordString'
Message coordMsg = coordHandler.obtainMessage();
Bundle coordMsgData = new Bundle();
coordMsgData.putString("coords", coordString);
coordMsg.setData(coordMsgData);
if(coordHandler!=null)
{
coordHandler.sendMessage(coordMsg);
}
return false;
}
public class ServerThread extends Thread
{
public void run() {
this.setName("serverThread");
Looper.prepare();
coordHandler = new Handler()
{
@Override
public void handleMessage(Message msg) {
Log.v(INNER_TAG,"here");
}
};
// SNIP: Connection logic here
Looper.loop();
}
}.
何年もの間、私は、なぜINNER_TAG
タッチ イベントの後に の値がログに表示されるのを見たことがないのかと頭を悩ませていました。ログデバッグを使用して実行をcoordHandler!=null
ブロックに追跡することはできましたが、ハンドラーが起動することはありませんでした。
それから私は驚いた:スレッドはおそらく接続の完了後に終了している. ああ!以前に何が起こっていたと思っていたのかはよくわかりませんが、Loop
魔法のようなことをしていると信じていたせいにします.
私の質問は次のとおりです。どうすればスレッドを実行し続けることができますか? スレッドに関する公式のAndroid dev リファレンスには、次のことが簡単に述べられています。
スレッドは、バックグラウンドで実行されるデーモンにすることもできます。
これは当然私の*nixの感覚をうずきました。(ちなみに、新しいスパイダーマンの映画はもう見ましたか? かなり良いです。) デーモン化が答えですか? それとも、プロットを完全に失ってしまったのでしょうか?