【问题标题】:How to update a view on a scheduled period如何在计划期间更新视图
【发布时间】:2013-03-29 23:29:21
【问题描述】:

谁能告诉我如何在预定时间段更新视图。例如每秒。

MyService.wm.updateViewLayout(mView, mLayoutParams);

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

04-08 01:19:35.910: W/dalvikvm(11040): threadid=13: 线程退出 未捕获的异常(组=0x40a3e1f8)04-08 01:19:35.910: E/AndroidRuntime(11040):致命异常:Thread-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):在 android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:312) 04-08 01:19:35.910: E/AndroidRuntime(11040): 在 android.view.WindowManagerImpl$CompatModeWrapper.updateViewLayout(WindowManagerImpl.java:145) 04-08 01:19:35.910: E/AndroidRuntime(11040): 在 com.example.MyService.UpdateLayers(TrackerService.java:353) 04-08 01:19:35.910: E/AndroidRuntime(11040): 在 com.example.MainActivity$5$1.run(MainActivity.java:219)

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

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

那么,你能告诉我正确的方法来更新图层吗?

【问题讨论】:

    标签: android multithreading view timer android-windowmanager


    【解决方案1】:

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

    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);

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2019-12-17
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多