1

有人可以告诉我如何在预定期间更新视图。例如每秒。

MyService.wm.updateViewLayout(mView, mLayoutParams);

我遇到的问题是,当我使用在不同线程上运行的计时器时,它不允许我更新视图并给出以下错误。

04-08 01:19:35.910: W/dalvikvm(11040): threadid=13: 线程退出未捕获异常 (group=0x40a3e1f8) 04-08 01:19:35.910: E/AndroidRuntime(11040): 致命异常: 线程-1376 04-08 01:19:35.910: E/AndroidRuntime(11040): android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸其视图。04-08 01:19:35.910: E/AndroidRuntime(11040): 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039) 04-08 01:19:35.910: E/AndroidRuntime(11040): 在 android. view.ViewRootImpl.requestLayout(ViewRootImpl.java:709) 04-08 01:19:35.910: E/AndroidRuntime(11040): 在 android.view.View.requestLayout(View.java:12680) 04-08 01:19: 35.910: E/AndroidRuntime(11040): 在 android.view.View.setLayoutParams(View.java:8223) 04-08 01:19:35.910: E/AndroidRuntime(11040):

当我尝试从同一个 Activity 或服务更新它时,它会挂起而不做任何其他事情。只是在循环中运行。

while (true) {
    MyService.UpdateLayers();
    try {
        Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

那么,您能否告诉我正确的方法来执行此操作或解决更新图层的问题。

4

1 回答 1

3

您可以尝试使用处理程序。您像这样在主线程上定义一个处理程序。-

protected Handler handler = new Handler()
{
    @Override
    public void handleMessage(Message msg) {
        switch(msg.what) {
            case DO_SOME_VIEW_CHANGES:
            {
                // Your logic
                break;
            }
        }
    }
};

然后,您需要创建一个接收处理程序实例的线程,并在其中调用。-

handler.sendEmptyMessage(DO_SOME_VIEW_CHANGES);

希望能帮助到你。

于 2013-04-08T01:12:29.793 回答