Java - 只有创建视图层次结构的原始线程才能触及其视图异常?

时间:2017-03-20 19:20:57

标签: java android thread-exceptions

我得到上面的错误,并没有真正的想法。我正在开发相机应用程序,现在发生错误。可能textureView导致错误。那就是例外:

example.com.view.CameraActivity : Only the original thread that created a view hierarchy can touch its views.
java.lang.RuntimeException
  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7101)
  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1137)
  at android.view.ViewGroup.invalidateChild(ViewGroup.java:5254)
  at android.view.View.invalidateInternal(View.java:13669)
  at android.view.View.invalidate(View.java:13633)
  at android.view.View.invalidateParentIfNeeded(View.java:13822)
  at android.view.TextureView.setTransform(TextureView.java:483)
  at example.com.data.BasicFragment.configureTransform(BasicFragment.java:850)
  at example.com.data.BasicFragment.access$100(BasicFragment.java:69)
  at example.com.data.BasicFragment$2.onOpened(BasicFragment.java:182)
  at android.hardware.camera2.impl.CameraDeviceImpl$1.run(CameraDeviceImpl.java:134)
  at android.os.Handler.handleCallback(Handler.java:751)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:173)
  at android.os.HandlerThread.run(HandlerThread.java:61)
    03-20 20:07:18.531 25889-26077/example.com.kamera E/AndroidRuntime: FATAL EXCEPTION: CameraBackground
  Process: example.com.kamera, PID: 25889
  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7103)
  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1137)
  at android.view.ViewGroup.invalidateChild(ViewGroup.java:5254)
  at android.view.View.invalidateInternal(View.java:13669)
  at android.view.View.invalidate(View.java:13633)
  at android.view.View.invalidateParentIfNeeded(View.java:13822)
  at android.view.TextureView.setTransform(TextureView.java:483)
  at example.com.data.BasicFragment.configureTransform(BasicFragment.java:850)
  at example.com.data.BasicFragment.access$100(BasicFragment.java:69)
  at example.com.data.BasicFragment$2.onOpened(BasicFragment.java:182)
  at android.hardware.camera2.impl.CameraDeviceImpl$1.run(CameraDeviceImpl.java:134)
  at android.os.Handler.handleCallback(Handler.java:751)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:173)
  at android.os.HandlerThread.run(HandlerThread.java:61)

你知道导致这个错误的原因吗?行850如下:mTextureView.setTransform(matrix);。为什么我在这里收到错误?

1 个答案:

答案 0 :(得分:0)

我不是Android开发人员,但遇到的问题与Swing UI的问题类似 - 在那里你也不能直接从另一个线程修改一些UI组件。从另一个线程中,您必须使用invokeLater()来执行此操作,以便Swing调度程序线程将自己执行您想要的任务。原因是如果两个线程同时写入相同的变量,则可能会发生一些难以跟踪的并发错误。 因此,您遇到的问题与Exception所说的完全相同:“只有创建视图层次结构的原始线程才能触及其视图”。尝试在您使用的视图技术中找到与invokeLater()类似的机制。