【发布时间】:2017-01-30 09:25:35
【问题描述】:
我有一个 Runnable(比如“MyThread”),它执行一个长任务并使用/锁定一个线程安全的单例。
我注意到,当按下后退按钮时,屏幕会立即退出活动,并且没有视觉指示 MyThread 已正确完成。
当我“重新打开”我的应用程序时,单例仍然被锁定,这也证明了这一点!!!!当然 getLockedInstance() 返回 null。
所以我想我的问题是...... 即使在执行关键任务时按下后退按钮,Android 应用程序到底会发生什么? 线程是否终止?活动的线程是否被冻结,因此所有数据都被访问和使用?我们如何确保关键任务能够完成执行?
// singleton class
public class Storage
{
private int count = 0;
private static final Storage ourInstance = new Storage();
public static synchronized Storage getLockedInstance()
{
if (ourInstance.count > 0)
return null;
ourInstance.count++;
return ourInstance;
}
public synchronized void UnlockInstance()
{
if (count > 0)
count--;
}
}
// runnable declaration
private Runnable MyThread = new Runnable()
{
@Override
public void run()
{
Storage s = Storage.getLockedInstance();
..... do stuff .....
[back button pressed]
..... this is never reached .....
s.UnlockInstance();
}
}
【问题讨论】:
-
线程不一定会停止,但如果您的应用程序现在处于后台,则该进程可能会被终止。您是否尝试过在线程中添加日志调用?如果您绝对需要运行任务,请考虑将其放入
Service中,它将作为与您的应用程序分开的进程运行。 -
请从您的标题中删除“已解决”并将您找到的解决方案作为正确答案发布。
标签: java android multithreading android-activity singleton