Java 从单独的线程调用requestLayout

Java 从单独的线程调用requestLayout,java,android,android-layout,Java,Android,Android Layout,我在GLSurfaceView.Renderer上有一个OpenGL游戏循环(更新+绘制),它在一个单独的线程上运行,而不是在生成GLSurfaceView子类(包含渲染器)的线程上运行 有时,更新循环逻辑决定,“嗯,我们需要将视图大小调整到一半”。然后它调用GLSurfaceView视图的requestLayout,我的onMeasure函数将负责调整大小 然而,事实证明,除了创建视图层次结构的原始线程之外,我不应该从任何其他线程调用requestLayout。我得到了以下例外: E/Andr

我在GLSurfaceView.Renderer上有一个OpenGL游戏循环(更新+绘制),它在一个单独的线程上运行,而不是在生成GLSurfaceView子类(包含渲染器)的线程上运行

有时,更新循环逻辑决定,“嗯,我们需要将视图大小调整到一半”。然后它调用GLSurfaceView视图的requestLayout,我的onMeasure函数将负责调整大小

然而,事实证明,除了创建视图层次结构的原始线程之外,我不应该从任何其他线程调用requestLayout。我得到了以下例外:

E/AndroidRuntime( 3693): FATAL EXCEPTION: GLThread 3424
E/AndroidRuntime( 3693): Process: com.android.gl2jni, PID: 3693
E/AndroidRuntime( 3693): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
E/AndroidRuntime( 3693):        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
E/AndroidRuntime( 3693):        at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:857)
E/AndroidRuntime( 3693):        at android.view.ViewGroup.invalidateChild(ViewGroup.java:4320)
E/AndroidRuntime( 3693):        at android.view.View.invalidate(View.java:10935)

<snip>
E/AndroidRuntime(3693):致命异常:GLThread 3424
E/AndroidRuntime(3693):进程:com.android.gl2jni,PID:3693
E/AndroidRuntime(3693):android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
E/AndroidRuntime(3693):位于android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
E/AndroidRuntime(3693):位于android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:857)
E/AndroidRuntime(3693):位于android.view.ViewGroup.invalidateChild(ViewGroup.java:4320)
E/AndroidRuntime(3693):位于android.view.view.invalidate(view.java:10935)
我尝试使用PostnValidate,但我认为我需要更接近postRequestLayout()的东西。但是,只有requestLayout()

我该如何触发requestLayout呢

我不确定这是否会使事情复杂化,但该视图属于运行输入法服务的任何人。是的,这是一个基于OpenGL的android键盘,但这是另一个可能与此问题不太相关的长篇大论。

您需要
post()
a
Runnable
,将任何与UI相关的操作发送到主线程

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // do UI work
        yourview.requestLayout();
    }
});
需要注意的是,放入
run()
方法中的代码不会立即完成。它被添加到主线程处理的队列中,并将在将来“某个时候”执行