我的 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 开发参考简要提到
一个线程也可以成为一个守护进程,使它在后台运行。
这自然让我的*nix 感觉刺痛。(顺便说一句,你看过新的蜘蛛侠电影了吗?它很不错。) 守护进程是答案吗?还是我完全失去了情节?