【发布时间】:2019-10-28 13:49:01
【问题描述】:
我正在编写代码以在特定时刻从应用屏幕保存位图。
我通过监听某些组件的 onDraw() 事件并检查一组条件是否为真来做到这一点
@Override
public void onDraw() {
if (checkConditions()) {
Canvas canv = new Canvas(tmpBitmap);
canvasView.draw(canv);
saveBitmapToImage(tmpBitmap, Bitmap.CompressFormat.JPEG);
this.lastDraw = System.currentTimeMillis();
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
viewKonfetti.getViewTreeObserver().removeOnDrawListener(listener);
});
}
}
但有时我在删除侦听器时遇到异常
Fatal Exception: java.lang.IllegalStateException: Cannot call removeOnDrawListener inside of onDraw
at android.view.ViewTreeObserver.removeOnDrawListener(ViewTreeObserver.java:736)
at com.tomatedigital.lottogram.dialogs.ShuffleWinnerDialog$Shuffler$2.lambda$onParticleSystemEnded$1(ShuffleWinnerDialog.java:235)
at com.tomatedigital.lottogram.dialogs.-$$Lambda$ShuffleWinnerDialog$Shuffler$2$vCYJiRVhO65xXIsicqZHHpw_34A.run(-.java:4)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
这并不总是发生,它有时会在生产中发生(在许多不同的 android 设备上)。但是为什么呢?
我什至正在使用一个新线程来删除监听器...
我测试过,即使删除新线程也不能解决问题:此错误不会 100% 发生,只是有时。
解释是什么?如何解决?
【问题讨论】:
标签: android android-view android-drawable