【问题标题】:How to program a pause in my app without locking up the app如何在我的应用程序中编程暂停而不锁定应用程序
【发布时间】:2014-03-28 20:25:59
【问题描述】:

我正在 Android 中制作一个游戏,它有 1 个 ImageView 和 4 个图像和按钮。我设置了 ImageView 以便在其中放置一个随机图像,并在经过这么长时间后显示一个新的随机图像。我需要找到一种方法来延迟更改不锁定 UI 的图像。这是相关的代码。

public class MainGameActivity extends Activity {

    int points = 0, score = 0, timer = 1000;
    ImageView imgView = (ImageView)findViewById(R.id.image);
    Random randy = new Random();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_game_activity);
        while(points >= 0) {
            changeImage();
        //Timer goes here
        }       
    }

    private void changeImage() {
        int randyInt = randy.nextInt(4);
        if (randyInt == 0){
            imgView.setImageDrawable(getResources().getDrawable(R.drawable.cheese));
        } else if (randyInt == 1) {
            imgView.setImageDrawable(getResources().getDrawable(R.drawable.worm1));
        } else if (randyInt == 2) {
            imgView.setImageDrawable(getResources().getDrawable(R.drawable.worm2));
        } else if (randyInt == 3) {
            imgView.setImageDrawable(getResources().getDrawable(R.drawable.minnow));
        }
    }
}

4 个按钮使用与 ImageView 相同的可绘制对象。当按下按钮时,ImageView 中的可绘制对象和图像按钮中的可绘制对象被检查是否等效,因此 UI 仍然必须工作,而包含更改 ImageView 可绘制对象的暂停的 while 循环仍在运行。感谢您提供的任何帮助。

【问题讨论】:

    标签: android


    【解决方案1】:

    听起来你需要一个计时器。 这已经被问到并得到了回答。请看一下这个 stackoverflow 答案Android timer? How-to?

    【讨论】:

      【解决方案2】:

      您也可以尝试使用 Switch 案例而不是所有那些 ifs

      Switch(randyInt){
      
      case 1:imgView.setImageDrawable(getResources().getDrawable(R.drawable.cheese));
      break;
      case 2:imgView.setImageDrawable(getResources().getDrawable(R.drawable.worm1));
      break;
      case 3:imgView.setImageDrawable(getResources().getDrawable(R.drawable.worm2));
      break;
      case 4:imgView.setImageDrawable(getResources().getDrawable(R.drawable.minnow));
      break;
      default:imgView.setImageDrawable(getResources().getDrawable(R.drawable.cheese));
      break;
      }
      

      【讨论】:

        【解决方案3】:

        您可以像Lasse 在他的回答中指出的那样使用计时器。首先你需要声明它:

        private CountDownTimer timer;
        

        然后在您的onCreate 中,您可以调用计时器(在此示例中,我每 5 秒(5000 毫秒)更改一次图像,但您可以根据需要进行更改):

        timer = new CountDownTimer(5000, 20) {
        
            @Override
            public void onTick(long millisUntilFinished) {
        
            }
        
            @Override
            public void onFinish() {
                try{
                    callImage();
                }catch(Exception e){
                }
            }
        };
        

        然后在您的callImage 方法中,您在imageView 上设置图像并再次启动计时器:

        private void callImage(){
            int randyInt = randy.nextInt(4);
            if (randyInt == 0){
                imgView.setImageDrawable(getResources().getDrawable(R.drawable.cheese));
            } else if (randyInt == 1) {
                imgView.setImageDrawable(getResources().getDrawable(R.drawable.worm1));
            } else if (randyInt == 2) {
                imgView.setImageDrawable(getResources().getDrawable(R.drawable.worm2));
            } else if (randyInt == 3) {
                imgView.setImageDrawable(getResources().getDrawable(R.drawable.minnow));
            }
            try{
                imgView.post(new Runnable() {
        
                    @Override
                    public void run() {
                        timer.start();
                    }
                });
            }catch(Exception e){
                Log.e("Error", "Error: " + e.toString());
            }
        
        }
        

        因此,每 5 秒(或您需要的时间)它会更改图像,并且不会阻塞 UI。

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-02
          • 1970-01-01
          • 2018-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-15
          • 2013-03-09
          相关资源
          最近更新 更多