我在画布上有一个Android绘画线程。这一切都很好,但如果我按下后退按钮,应用程序崩溃,因为线程仍然试图在当时为null的画布上绘制。从代码中我会说线程永远不会再到达那段代码了。
按下后退按钮,我的Surface会被破坏:
public void surfaceDestroyed(SurfaceHolder holder)
{
boolean retry = true;
thread.setRunning(false);
while (retry)
{
try
{
thread.join();
retry = false;
}
catch (InterruptedException e)
{
}
}
}
因此,正如您在上面所看到的,我将thread.setRunning设置为false,我的线程执行此操作
public void run()
{
while (run)
{
Canvas c = null;
try
{
c = sh.lockCanvas(null);
synchronized (sh)
{
doDraw(c);
}
}
finally
{
if (c != null)
{
sh.unlockCanvasAndPost(c);
}
}
}
}
只要我将此var设置为false,while循环就应该停止,但它仍然会进入doDraw()方法。我不明白为什么doDraw(这里我得到我的空指针expetion)仍然被调用。任何一个想法?
答案 0 :(得分:0)
我不是Android专家,而是初学者,但是扩展同步块(你必须具有读取值并将值用作一个原子操作),例如
synchronized (sh)
{
c = sh.lockCanvas(null);
doDraw(c);
}
此外,或许你可以在onStop中停止/销毁你的附加线程吗?你的活动的onDestroy方法?
我也想知道最后阻止。也许它也应该同步?不确定......
答案 1 :(得分:0)
我不知道它是否适合您,但您可以尝试在 IntentService 中执行相同的任务。
在活动结束时停止IntentService,这可能会解决您的问题。我想你使用处理程序来绘制doDraw方法,我错了吗?请让我知道你的想法和结果
答案 2 :(得分:0)
Thread#join
不会杀死线程,只是等待它死掉。您应该通过设置run=false
或使用stop
或interrupt
等方法来破坏线程内的循环。它们已被弃用,基本上不应该被使用。