Java 如何使连接线程保持活动状态?(我需要使用守护进程吗?)
我的Android应用程序使用一个线程来监听通过USB连接的PC的套接字连接。在电脑打开连接后的某个时刻(响应某些用户驱动的事件),我想通过它发送一些数据Java 如何使连接线程保持活动状态?(我需要使用守护进程吗?),java,android,multithreading,Java,Android,Multithreading,我的Android应用程序使用一个线程来监听通过USB连接的PC的套接字连接。在电脑打开连接后的某个时刻(响应某些用户驱动的事件),我想通过它发送一些数据 public void onCreate(Bundle savedInstanceState) { // SNIP: stuff and nonsense connection = new Thread(new ServerThread()); connection.start(); } public boole
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();
}
}.
多年来,我一直在挠头,想知道为什么在触摸事件之后,我从来没有在我的日志中看到internal_TAG
的值。我可以使用日志调试将执行跟踪到coordHandler=null
块,但处理程序似乎从未启动
然后我突然想到:线程可能在完成连接后退出D'uh我不太清楚我之前认为发生了什么,但我会将其归咎于一种信念,即循环
正在做一些神奇的事情
所以我的问题是:如何保持线程运行?这位官员简要地提到
线程也可以成为守护进程,使其在后台运行
这自然让我的尼克斯感觉刺痛。(顺便问一下,你看过《蜘蛛侠》这部新电影了吗?它相当不错。)守护进程就是答案吗?还是我完全失去了剧情?在Android中使用服务 您可以使用服务在后台运行。 请参阅此链接: 有关示例,请参见此链接:
connection=新线程(newserverthread())代码>到:连接=新服务器线程()代码>
布尔onTouchEvent(MotionEvent事件)
而不是布尔dispatchTouchEvent(MotionEvent ev)
当触摸屏事件未由其下的任何视图处理时,会调用由于文档而导致的onTouchEvent。因此,可能从未调用此处理程序方法Log.v
?它假定您已将日志记录级别设置为verbose,否则将放弃日志。我建议使用而不是Log.I
也许可以尝试以下代码:
ServerThread connection;
Handler coordHandler;
public void onCreate(Bundle savedInstanceState) {
connection = new ServerThread();
connection.start();
}
@Override
protected void onDestroy() {
synchronized (this) {
if(coordHandler != null) {
coordHandler.getLooper().quit();
}
}
super.onDestroy();
}
public boolean dispatchTouchEvent(MotionEvent event) {
synchronized (this) {
if(coordHandler == null) {
Log.i(INNER_TAG, "Handler is null");
}
else {
Log.i(INNER_TAG, "Handler exists");
coordHandler.sendMessage(
coordHandler.obtainMessage(
0, event.toString()));
}
}
return false;
}
synchronized void setCoordHandler(Handler handler) {
coordHandler = handler;
}
public class ServerThread extends Thread {
public void run() {
this.setName("serverThread");
Looper.prepare();
setCoordHandler(new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(INNER_TAG, "Inside handler");
}
});
Looper.loop();
}
}
谢谢你的回复。我会尝试其他建议,但我可以排除5。正如我上面所说的,我可以肯定触摸事件被称为。这似乎是一条路要走。您是否有可能扩展您的答案,以包括一个示例?