使用多个线程(或处理程序),但Android UI-Thread仍然卡住?

时间:2014-02-03 07:42:41

标签: java android multithreading android-layout android-fragments

  

我使用textview通过翻译实现了自动收报机   使用setX()方法的textview。

     

在imageview上我必须显示多个   图像,一个接一个地翻转。

     

因为两者都必须并行和连续运行。

我使用处理程序而不是使用线程来实现它。

使用处理程序;

TickerHandler ,在几秒钟后连续更新setX()值,因此效果类似于生成工作正常。

new Handler() {
            @Override
            public void handleMessage(Message msg) {
                currentX = tv.getX();

                if ((currentX + 10) > 600) {
                    tv.setX(10);
                }
                tv.setX(currentX + 5);

                this.sendEmptyMessageDelayed(0, 50);
            }
        }.sendEmptyMessage(0);

FlipHandler ,在imageview上更新新图片,翻转图片,工作正常。

new Handler() {
            @Override
            public void handleMessage(Message msg) {
                imgV.setImageResource(images[imgCount % 5]);

                imgCount++;
                if (imgCount > 5) {
                    imgCount = imgCount % 5;
                }
                this.sendEmptyMessageDelayed(0, 500);
            }
        }.sendEmptyMessage(0);

使用线程;

同样在线程中,因为android不允许其他线程与UI通信。因此,runOnUiThread必须与UI通信。

自动收报机和图像翻板都正常工作。

面临问题;

Q>当图像发生变化时,股票代码被卡住了几毫秒,由于股票行情不顺畅,股票代码会产生抽搐效应。

问题的原因我认为

  • 虽然我有不同的主题,但是当我调用setX()来翻译textview和imageView.setImage ????(.....)时。我必须在 UiThread 上打电话给他们。这就是为什么当图像改变并且setImage()被称为setX()等待和TextView停止翻译那段时间导致抽搐效果。

对此我有什么想法可以克服这种情况。

感谢;

1 个答案:

答案 0 :(得分:2)

这两种方法最终都会在UI线程上使用处理程序:如果当前线程不是UI线程,runOnUiThread()会将runnable发布到UI线程处理程序。

当处理程序处理消息时,"显然"它无法处理其他消息。

你可以改变以使事情更顺畅的事情:

  • 使用animations framework代替动画而不是自定义处理程序消息。

  • 卸载位图I / O并解码为后台线程。在UI线程中,只需将预解码图像位图切换到图像视图。 Reference