Java - Only the original thread that created a view hierarchy can touch its views Exception?

383 Views Asked by At

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?

1

There are 1 best solutions below

0
Jurass On

I'm not Android developer but problem you encounter looks similar to the problem with Swing UI - there you also can't just modify some UI component directly from another thread. From another thread you must use invokeLater() to do this so the Swing dispatcher thread will execute task you want by itself. The reason is that if two threads will write to the same variables at the same time then some hard to track concurrency errors can occurs. Therefore problem what do you encounter looks exactly as the Exception say: "Only the original thread that created a view hierarchy can touch its views". Try to find similar mechanism to the invokeLater() in the view technology you use.