【问题标题】:Android/Java - pause threadAndroid/Java - 暂停线程
【发布时间】:2011-10-17 13:45:32
【问题描述】:

我是新手,所以也许这对每个人来说都是微不足道的,但我就是想不通,为什么这不起作用。我已经阅读了它,尝试了很多方法,但仍然无法正常工作。所以我想在android(java)中暂停一个线程。我希望它运行,冻结屏幕 1 秒,然后继续工作。就这样。为什么这不起作用?

public class Game extends Activity {

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.game);

        runner.join();
        runner.start();

        // do stuff

        pause();

        // do stuff


}

private boolean running = true;
private boolean paused = false;

public void setRunning(boolean run) {
    running = run;
}

public void pause() {
    paused = true;
}

Thread runner = new Thread() {

    public void run() {

        while (running) {

            try {

                //do stuff

                Thread.sleep(100);

                while (paused) {
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                    } finally {
                        paused = false;
                    }
                }

            } catch (Exception e) {
            }
        }

    }

};

}

【问题讨论】:

  • while(paused) 循环中的异常可能正在触发。在 catch 块中将异常消息记录到控制台。

标签: java android multithreading


【解决方案1】:

你应该改变方法调用的顺序,你编码:

    runner.join();
    runner.start();

改为:

runner.start();
runner.join();

它应该可以工作。

【讨论】:

  • 这样我只能看到黑屏。
【解决方案2】:

onCreate 方法中调用Thread.sleep。扔掉所有线程的东西。这是错误的。

为什么要冻结屏幕?这是一个非常糟糕的方法。改用对话框。

【讨论】:

    【解决方案3】:

    如果你需要冻结屏幕,你只需要使用 SystemClock.sleep(millis).//1000 = 1 秒 Android使用主线程为你的界面大不相同。您的代码尝试像 java 程序一样停止它。

    例子

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        SystemClock.sleep(1000);
    

    ...

    或像这样搜索信息:

    //this is similar to your thread
       new Thread(new Runnable() {
           @Override
           public void run() {
               //some code
               int val = 1+ 1; //code here dont interrupt main thread
    
               //this code run on main thread
               mActivity.runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       //freeze Views
                       SystemClock.sleep(1000);// 1 second
                   }
               });
    
           }
       });
    

    【讨论】:

      【解决方案4】:

      使用这个

      delayprg(3000);//3seg

       private void delayprg(int delayc) {
              try {
                  Thread.sleep(delayc);
              } catch (InterruptedException e) {
              }
          }
      

      【讨论】:

        【解决方案5】:

        你必须避免旋转试试这个:

        private boolean isPaused = false;
        
        
        public synchronized void pause(){
            isPaused = true;
        }
        
        public synchronized void play(){
           isPaused = false;
           notifyAll();
        }
        
        public synchronized void look(){
           while(isPaused)
              wait();
        }
        
         public void run(){
             while(true){
                look();
                //your code
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-21
          • 2011-08-08
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多