Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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
Android 停止处理程序线程_Android_Multithreading_Android Service - Fatal编程技术网

Android 停止处理程序线程

Android 停止处理程序线程,android,multithreading,android-service,Android,Multithreading,Android Service,在我们的一个应用程序上,我们使用带有通知的后台服务(基本上是前台服务,但您知道,当服务保持活动时,活动是可关闭的) 在这个服务上,我们使用3个独立的HandlerThreads和handler来管理不同的操作,并且有一定的延迟(例如250毫秒)。现在,如果屏幕关闭,这些操作需要停止,如果屏幕重新打开,这些操作需要恢复。由于这种情况,我们在服务中添加了一个广播接收器,并创建了删除的线程。到目前为止一切正常 为了停止操作,我们通过调用Handler.removeCallbacksAndMessage

在我们的一个应用程序上,我们使用带有通知的后台服务(基本上是前台服务,但您知道,当服务保持活动时,活动是可关闭的)

在这个服务上,我们使用3个独立的
HandlerThreads
handler
来管理不同的操作,并且有一定的延迟(例如250毫秒)。现在,如果屏幕关闭,这些操作需要停止,如果屏幕重新打开,这些操作需要恢复。由于这种情况,我们在服务中添加了一个广播接收器,并创建了删除的线程。到目前为止一切正常

为了停止操作,我们通过调用
Handler.removeCallbacksAndMessages(null)
删除了处理程序上的消息,它实际上清除了消息队列但是,处理程序线程保持活动状态。这是一个问题

为了停止线程,我们使用了
HandlerThread.quit()
,它在内部调用
Looper.quit()
,我们认为它将完成线程,但没有,先生,它不会删除线程,因为我们从结构中得到一些报告,这些报告导致
pthread\u创建失败(1040kb堆栈),请重试
或其他操作。在它下面,有940个单独的线程命名相同的线程,这导致了OOM(内存不足)错误。这是我们的一个巨大错误

问题是:我们如何停止处理程序线程?是
HandlerThread.interrupt()
就足够了吗?谢谢你的帮助。PS:我不能分享任何源代码,在这种情况下我认为没有必要,因为问题本身是不言自明的

编辑:因为您要求一些代码,所以我将展示一个我遵循的一些逻辑的示例

public class ThreadHelper implements Runnable
{

    private HandlerThread handlerThread = new HandlerThread("ThreadName");
    private Handler handler;

    private boolean shouldRun = true;

    public ThreadHelper()
    {
        handlerThread.start();
        startThread();
    }

    // Called if the screen state is turned on.
    public void startThread()
    {
        if (handlerThread == null)
        {
             handlerThread = new HandlerThread("ThreadName");
             handlerThread.start();
        }
        if (handler == null)
        {
             handler = new Handler(handlerThread.getLooper());
             handler.post(this);
        }
    }

    // Called if the screen state is turned off.
    public void stopThread()
    {
        shouldRun = false;
        handler.removeCallbacksAndMessages(null);
        handlerThread.quit();
        try
        {
            handlerThread.interrupt();
        }
        catch (Exception ignored)
        {
            // Skipped Thread.currentThread().interrupt() check here since this is
            // called from a different thread that is not associated.
        }

        // remove variables.
        handler = null;
        handlerThread = null;
    }

    @Override
    public void run()
    {
        if (shouldRun)
        {
            // rest of the code without having a long-running
            // operation. Mostly ends in 1~2 millseconds.

            // Continue looping.
            handler.postDelayed(this, 250); 
        }
    }
}

plz向我们展示一些代码,如果您仍有一个长时间运行的任务仍在线程中运行=>调用quit and interrupt将不会停止它除非您添加一个if条件来检查线程中的中断以停止它添加了一些示例代码。plz向我们展示一些代码,如果您仍有一个长时间运行的任务仍在线程中运行=>调用quit and interrupt将不会停止iTunes,除非您添加一个if条件来检查线程中是否有中断以停止iTunes,并添加了一些示例代码。