android程序中的睡眠功能[重复]

Posted

技术标签:

【中文标题】android程序中的睡眠功能[重复]【英文标题】:Sleep function in android program [duplicate] 【发布时间】:2012-01-12 06:32:50 【问题描述】:

让我的程序进入睡眠状态时遇到问题 我想做的是当按下 btnStart 时,将图片随机设置为 12 个 ImageButtons 然后我希望它暂停 5 秒,然后将第一个 ImageButton 更改为另一张图片

我的代码看起来像这样,现在按下按钮时它会立即暂停...

       btnStart.setOnClickListener(new View.OnClickListener() 
        @Override

        public void onClick(View v) 
            // TODO Auto-generated method stub

            Collections.shuffle(pic);
            int time=1;
            press=true;

            pic.get(0).setImageDrawable(getResources().getDrawable(R.drawable.memgreen));
            pic.get(1).setImageDrawable(getResources().getDrawable(R.drawable.memgreen));
            pic.get(2).setImageDrawable(getResources().getDrawable(R.drawable.memred));
            pic.get(3).setImageDrawable(getResources().getDrawable(R.drawable.memred));
            pic.get(4).setImageDrawable(getResources().getDrawable(R.drawable.memblue));
            pic.get(5).setImageDrawable(getResources().getDrawable(R.drawable.memblue));
            pic.get(6).setImageDrawable(getResources().getDrawable(R.drawable.memwhite));
            pic.get(7).setImageDrawable(getResources().getDrawable(R.drawable.memwhite));
            pic.get(8).setImageDrawable(getResources().getDrawable(R.drawable.mempurple));
            pic.get(9).setImageDrawable(getResources().getDrawable(R.drawable.mempurple));
            pic.get(10).setImageDrawable(getResources().getDrawable(R.drawable.memyellow));
            pic.get(11).setImageDrawable(getResources().getDrawable(R.drawable.memyellow));

            try 
                Thread.sleep(5000);

                pic.get(0).setImageDrawable(getResources().getDrawable(R.drawable.coin));

             catch (InterruptedException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
     
  );

【问题讨论】:

问题出在哪里? 【参考方案1】:

好吧,如果你想让 UI 保持响应,你不能用Thread.sleep 阻塞 UI 线程。

创建一个新线程,然后将其休眠。休眠后,在UI线程上运行改变视图drawable的方法

new Thread(new Runnable() 
    @Override
    public void run() 
        try 
            Thread.sleep(5000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        runOnUiThread(new Runnable() 
            @Override
            public void run() 
                pic.get(0).setImageDrawable(getResources().getDrawable(R.drawable.coin));
            
        );
    
).start();

【讨论】:

或者使用AsyncTask:android-developers.blogspot.com/2009/05/painless-threading.html 谢谢!我对此很陌生,但它很有意义。现在工作:)【参考方案2】:

创建一个图像数组并设置一个处理程序。使用 postDelayed 不会阻塞线程。

            int[] imageArray =  R.drawable.img_1, R.drawable.img_2,
            R.drawable.img_3, R.drawable.img_4,
            R.drawable.img_5;

            Handler handler = new Handler();
            Runnable runnable = new Runnable() 
                int i = 0;

                public void run() 
                    imageView1.setImageResource(imageArray[i]);
                    i++;
                    if (i > imageArray.length - 1) 
                        i = 0;
                    
                    handler.postDelayed(this, 5000); //displays every 5 seconds
                
            ;
            handler.postDelayed(runnable, 5000);

【讨论】:

以上是关于android程序中的睡眠功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在android应用程序中实现MVC架构[重复]

中断一个非常长的睡眠功能[重复]

com.android.build.api.transform.TransformException:java.util.zip.ZipException:重复条目:com/google/androi

睡眠导致具有不可见内容的框架[重复]

手机睡眠时 Android 中的通知

Android服务被杀死[重复]