Android UI线程帮助新增功能

Android UI线程帮助新增功能,android,android-emulator,Android,Android Emulator,我试图使4个图像在一段时间后设置为不可见和可见,比如蓝色图像显示、蓝色图像隐藏、黄色图像显示、黄色图像隐藏。我希望不使用任何事件,只使用for循环。我正在尝试以下方法,但不起作用。我不熟悉android和图形。请帮帮我 public class GameActivity extends Activity { /** Called when the activity is first created. */ private Handler mHandler = new Handler();

我试图使4个图像在一段时间后设置为不可见和可见,比如蓝色图像显示、蓝色图像隐藏、黄色图像显示、黄色图像隐藏。我希望不使用任何事件,只使用for循环。我正在尝试以下方法,但不起作用。我不熟悉android和图形。请帮帮我

public class GameActivity extends Activity {    
/** Called when the activity is first created. */
private Handler mHandler = new Handler();
ImageView[] imViews = new ImageView[4];
ImageView imageView1;
ImageView imageView2;
ImageView imageView3;
ImageView imageView4;

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);

    setContentView(R.layout.myviewlay);
    imageView1= (ImageView)findViewById(R.id.ImageView01);
    imageView2= (ImageView)findViewById(R.id.ImageView02);
    imageView3= (ImageView)findViewById(R.id.ImageView03);
    imageView4= (ImageView)findViewById(R.id.ImageView04);


    final ImageView[] imViews = new ImageView[4];
    imViews[0] = imageView1;
    imViews[1] = imageView2;
    imViews[2] = imageView3;
    imViews[3] = imageView4;

    mHandler.removeCallbacks(mUpdateTimeTask);                         
    mHandler.postDelayed(mUpdateTimeTask, 100); 

}

private Runnable mUpdateTimeTask = new Runnable() {  
     public void run() {   

         for(int i=0; i < 5; i++)
         {
              imViews[i].setVisibility(View.INVISIBLE);
              mHandler.postDelayed(this, 1000); 
              imViews[i].setVisibility(View.INVISIBLE);
              mHandler.postDelayed(this, 1000); 
         }

         }};   
}
尝试使用:

imViews[i].setVisibility(View.GONE);

正如@MByD所说,只调用一次就可以改进代码。

使用postDelayed()无法实现这一点。该方法不会在循环中暂停您的方法。这可以通过使用Thread.sleep()来实现。但是,在UI线程上执行此操作最终将导致强制关闭,因为您将阻塞UI线程太长时间

基本上,您需要某种后台线程,执行等待您的任务,然后向UI线程发布一个runnable,显示/隐藏视图

private Runnable mUpdateTimeTask = new Runnable() {  
 public void run() {   

     for(int i=0; i < 5; i++)
     {
          final ImageView view = imViews[i];
          mHandler.post(new Runnable() {
              public void run() {
                  view.setVisibility(View.INVISIBLE);
              }
          });
          try {
              Thread.sleep(1000);
          } catch (Exception e) {} 
          mHandler.post(new Runnable() {
              public void run() {
                  view.setVisibility(View.VISIBLE);
              }
          });              
          try {
              Thread.sleep(1000);
          } catch (Exception e) {}         
     }

     }};   
}

您可能还想查看这个类,它可以帮助您定期运行东西。有几种方法可以做这些事情

哦,谢谢你,我没有意识到,但现在它给了我一个例外,我做错了什么吗?很抱歉,我对Android和图形方面的东西还不熟悉。。。日志猫说第60行有错误,第60行是mHandler.postDelayed(这是1000);有什么例外?它是第一个postDelayed还是第二个postDelayed?在第二个postDelayed上,但后来我把它注释掉了,现在它是imViews[i].setVisibility(View.INVISIBLE);在您的run()中是否有类似的NullPointException:`if(imViews[i]!=null){imViews[i].setVisibility(imViews[i].getVisibility()==View.VISIBLE?View.go:View.VISIBLE);mHandler.postDelayed(…);}else{//Log something}` imViews成员变量从未填充,由于onCreate()方法中定义了一个同名的局部变量。哇,谢谢stephan,它告诉我imViews[i]中的i必须是final,当我生成i final时,我可以合成i++;我还应该怎么迭代呢?噢,stephan,非常感谢你对我的帮助和耐心,我得到了上面显示的异常。。特别是第65行,它是view.setVisibility(view.INVISIBLE);我把它们贴在了我的原始信息上。请看我对你原始帖子的评论。您需要从onCreate()方法中删除一行,因为您不会用数据填充成员变量。很抱歉,我是这样一个新手,所以我应该更改什么以避免这种异常。。。?imViews是一个静态数组,因此我可以在mUpdateTask…中使用它,这是导致问题的变量?很抱歉,所有这些视图、图像。。runnables对我来说是新的:(–哇,它工作得非常好…最后一个问题,我保证>。要消除针对不同解决方案报告的NullPointerException,请从onCreate()中删除行
final ImageView[]imViews=new ImageView[4];
)方法。哇,效果非常好。最后一个问题,我保证>。别介意,我明白了!!:)。。。我希望我有你的头脑:)。非常感谢你的帮助
private Runnable mUpdateTimeTask = new Runnable() {  
 public void run() {   

     for(int i=0; i < 5; i++)
     {
          final ImageView view = imViews[i];
          mHandler.post(new Runnable() {
              public void run() {
                  view.setVisibility(View.INVISIBLE);
              }
          });
          try {
              Thread.sleep(1000);
          } catch (Exception e) {} 
          mHandler.post(new Runnable() {
              public void run() {
                  view.setVisibility(View.VISIBLE);
              }
          });              
          try {
              Thread.sleep(1000);
          } catch (Exception e) {}         
     }

     }};   
}
new Thread(mUpdateTimeTask).start();