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