Java 使用多个线程(或处理程序),但Android UI线程仍然存在问题?
我已经通过翻译使用textview实现了ticker textview使用setX()方法 在imageview上,我必须显示多个 图像,逐个翻转 因为两者必须并行和连续运行 我使用处理程序而不是线程实现了这个 使用处理器; TickerHandler,在几秒钟后持续更新setX()值,因此类似ticker的效果正常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) {
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线程中,只需将预解码的图像位图切换到图像视图