Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多个线程(或处理程序),但Android UI线程仍然存在问题?_Java_Android_Multithreading_Android Layout_Android Fragments - Fatal编程技术网

Java 使用多个线程(或处理程序),但Android UI线程仍然存在问题?

Java 使用多个线程(或处理程序),但Android UI线程仍然存在问题?,java,android,multithreading,android-layout,android-fragments,Java,Android,Multithreading,Android Layout,Android Fragments,我已经通过翻译使用textview实现了ticker textview使用setX()方法 在imageview上,我必须显示多个 图像,逐个翻转 因为两者必须并行和连续运行 我使用处理程序而不是线程实现了这个 使用处理器; TickerHandler,在几秒钟后持续更新setX()值,因此类似ticker的效果正常 new Handler() { @Override public void handleMessage(Message msg) {

我已经通过翻译使用textview实现了ticker textview使用setX()方法

在imageview上,我必须显示多个 图像,逐个翻转

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

我使用处理程序而不是线程实现了这个

使用处理器; TickerHandler,在几秒钟后持续更新setX()值,因此类似ticker的效果正常

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);
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);
FlipHandler,在imageview上更新新图像,翻转图像,工作正常

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

股票行情器和图像翻转器工作正常

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);
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);
面临的问题; Q> 当图像发生变化时,自动售检票机会被卡住几毫秒,因为自动售检票机运行不平稳,自动售检票机会产生抖动效果

问题的原因我怎么想
  • 虽然我有不同的线程,但当我调用setX()来翻译textview和imageView.setImage???(…)时。我必须在UiThread上调用它们。这就是为什么当图像被更改,setImage()被称为setX()时,等待,TextView停止转换,这会导致抖动效果
你知道我该如何克服这种情况吗


谢谢,

这两种方法最终都将在UI线程上使用处理程序:
runOnUiThread()
将在当前线程不是UI线程的情况下将runnable发布到UI线程处理程序

当处理程序处理消息时,“显然”它不能处理其他消息

您可以更改以使事情更顺利:

  • 对动画使用,而不是自定义处理程序消息

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


发布相关代码。我已经完成了这方面的作业,并尝试了不同的方法,如我前面提到的使用处理程序或线程。甚至我也得出结论,这是由于UiThread。我的代码没有问题。除了处理程序、线程或异步任务之外,我还需要一些替代方案。为了克服这个问题。如果有人需要进一步的细节,可以问。谢谢,伙计,你的建议有点用。至少有人在那里帮忙,如果他们帮不上忙的话,不要只是负面评论。你的建议行得通。谢谢