我正在做一个应用程序,我必须显示一系列图片:序列如下:
X
必须显示400毫秒EditText
但结果显示红色X
显示400毫秒,然后是空白屏幕。
这是我写的代码:
private void startThread(){
handler.postDelayed(new TaskScreenshot(), 400);
handler.postDelayed(new TaskNoise(), 500);
handler.postDelayed(new TaskEditText(), 100);
}
class TaskScreenshot implements Runnable{
@Override public void run() {
myImageView.setImageResource(R.drawable.googleplaybooks2);
myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
}
}
class TaskNoise implements Runnable{
@Override public void run() {
myImageView.setImageResource(R.drawable.noise);
myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
}
}
class TaskEditText implements Runnable{
@Override public void run() {
myInputFragment.getView().setVisibility(View.VISIBLE);
myImageFragment.getView().setVisibility(View.INVISIBLE);
}
}
在序列开始之前,X
已经设置了红色ImageView
。
我有什么问题吗? Runnable
是执行此序列的正确方法吗?
答案 0 :(得分:3)
postDelayed
方法不会累积延迟。你想要做的是:
private void startThread(){
handler.postDelayed(new TaskScreenshot(), 400);
handler.postDelayed(new TaskNoise(), 900);
handler.postDelayed(new TaskEditText(), 1000);
}
答案 1 :(得分:1)
Executors.newSingleThreadExecutor()应该是正确的选择,如果你想要代码中某些runnable的特定序列。
newSingleThreadExecutor()的Javadoc位于
之下创建一个Executor,它使用一个工作线程来操作 无界队列。 (但请注意,如果此单个线程终止 由于在关机之前执行期间出现故障,新的将会 如果需要执行后续任务,请取代它。)任务是 保证按顺序执行,并且不会超过一个任务 在任何给定时间都有效。与其他等同物不同 newFixedThreadPool(1)保证不返回执行者 可重新配置以使用其他线程。
你的startThread方法可以写成如下
private void startThread(){
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(new TaskScreenshot());
exec.execute(new TaskNoise());
exec.execute(new TaskEditText());
exec.shutdown();
}