如何确定可运行的顺序

时间:2014-01-11 10:23:09

标签: java android android-imageview runnable

我正在做一个应用程序,我必须显示一系列图片:序列如下:

  1. 红色X必须显示400毫秒
  2. 必须显示名为“屏幕截图”的图像500毫秒
  3. 必须显示名为“噪音”的图像50毫秒
  4. “噪音”图像消失,为EditText
  5. 腾出空间

    但结果显示红色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是执行此序列的正确方法吗?

2 个答案:

答案 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();
  }