Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使连接线程保持活动状态?(我需要使用守护进程吗?)_Java_Android_Multithreading - Fatal编程技术网

Java 如何使连接线程保持活动状态?(我需要使用守护进程吗?)

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

我的Android应用程序使用一个线程来监听通过USB连接的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();
    }
}.
多年来,我一直在挠头,想知道为什么在触摸事件之后,我从来没有在我的日志中看到
internal_TAG
的值。我可以使用日志调试将执行跟踪到
coordHandler=null
块,但处理程序似乎从未启动

然后我突然想到:线程可能在完成连接后退出D'uh我不太清楚我之前认为发生了什么,但我会将其归咎于一种信念,即
循环
正在做一些神奇的事情

所以我的问题是:如何保持线程运行?这位官员简要地提到

线程也可以成为守护进程,使其在后台运行


这自然让我的尼克斯感觉刺痛。(顺便问一下,你看过《蜘蛛侠》这部新电影了吗?它相当不错。)守护进程就是答案吗?还是我完全失去了剧情?

在Android中使用服务

您可以使用服务在后台运行。

请参阅此链接:

有关示例,请参见此链接:

  • 更改
    connection=新线程(newserverthread())到:
    连接=新服务器线程()

  • 可能在设置/获取处理程序实例时添加同步块(毕竟它位于不同的线程中:)

  • Loop实际上发挥了神奇的作用;)

  • 在onDestroy中退出serverThread的循环器

  • 最后但并非最不重要的一点(尽管它与处理程序/循环器主题无关,这可能是您从未在日志中看到预期内容的原因):使用
    布尔onTouchEvent(MotionEvent事件)
    而不是
    布尔dispatchTouchEvent(MotionEvent ev)
    当触摸屏事件未由其下的任何视图处理时,会调用由于文档而导致的onTouchEvent。
    因此,可能从未调用此处理程序方法

  • 编辑: 您确定它执行sendMessage吗?顺便问一下,为什么要使用
    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。正如我上面所说的,我可以肯定触摸事件被称为。这似乎是一条路要走。您是否有可能扩展您的答案,以包括一个示例?