-1

I get the error above and don't have really an idea why. I am developing a camera app and now a error occurs. Possibly a textureView is causing the error. That's the Exception:

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)

Do you know what causes this error? Line 850 is the following one: mTextureView.setTransform(matrix);. Why do I get an error here?

4

1 回答 1

0

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

于 2017-03-20T19:48:42.190 回答