2017-03-20 10 views
-1

私は上記のエラーを受けて、実際にはなぜそうは考えていません。私はカメラアプリを開発していますが、今はエラーが発生します。おそらくtextureViewが原因のエラーです。これは例外です:Java - ビュー階層を作成した元のスレッドのみがそのビューに触れることができます。例外?

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);。ここでエラーが発生するのはなぜですか?

+3

コードを一切使わずに、エラーメッセージの内容を繰り返すことができます。ビューを作成したスレッドとは異なるスレッドからビューを修正しようとしました。 – Henry

答えて

0

私はAndroidの開発者ではありませんが、遭遇する問題はSwing UIの問題と似ています。また、別のスレッドから直接UIコンポーネントを変更することはできません。別のスレッドから、invokeLater()を使用してこれを行う必要があります。そうすれば、Swingディスパッチャスレッドは自分が望むタスクを実行します。その理由は、2つのスレッドが同じ変数に同時に書き込むと、並行処理エラーを追跡するのが困難になることがあるからです。 したがって、「ビュー階層を作成した元のスレッドのみがそのビューに触れることができます」とExceptionとまったく同じように見えます。あなたが使用するビュー技術では、invokeLater()と同様のメカニズムを見つけようとします。

関連する問題