2017-06-18 112 views
-2

我想要一个android应用程序,只要按下按钮,背景就会闪烁。这有效,但是当我释放按钮时,背景不会停止闪烁。 我认为原因是我正在使用线程。我不知道如何阻止它(我正在第一次使用线程)。我想我可以在Action_Up事件中编写按钮“threadname.stop()”,但Android studio无法解析名称。 所以:我怎样才能停止线程,使Action_Up案例得到执行? 非常感谢!一旦按钮不再被按下,我怎样才能停止线程?

我的MainActivity代码:

import android.graphics.Color; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RelativeLayout; 

public class MainActivity extends AppCompatActivity { 

    Button flash; 
    RelativeLayout layout; 
    boolean backgroundisblack; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     backgroundisblack = true; 
     layout = (RelativeLayout)findViewById(R.id.layout); 
     flash = (Button)findViewById(R.id.flash); 

     //Button 
     flash.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 


       //button is pressed 
       switch (event.getAction()){ 
        case MotionEvent.ACTION_DOWN:{ 

         //thread 
         Thread t = new Thread(){ 
          @Override 
          public void run(){ 
           while(!interrupted()){ 
            try { 
             Thread.sleep(1000); 

             runOnUiThread(new Runnable(){ 
              @Override 
              public void run(){ 
               //action 
               if(backgroundisblack){ 
                layout.setBackgroundColor(Color.WHITE); 
                backgroundisblack = false; 
               }else if (!backgroundisblack){ 
                layout.setBackgroundColor(Color.BLACK); 
                backgroundisblack = true; 
               } 



              } 
             }); 
            }catch (InterruptedException e){ 
             e.printStackTrace(); 
            } 
           } 
          } 
         }; 
         t.start(); 


         break; 
        } 

        //button is released 
        case MotionEvent.ACTION_UP:{ 
         layout.setBackgroundColor(Color.BLACK); 

         break; 
        } 
       } 
       return false; 
      } 
     }); 


    } 
} 
+1

可能的重复[你如何杀死Java中的线程?](https://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java) – user1643723

回答

0

组布尔场

private boolean runningThread; 

然后更改run方法:

public void run(){ 
    runningThread = true; 
    while(runningThread){ 
    // ... 

和释放:

case MotionEvent.ACTION_UP:{ 
    runningThread = false; 
    // ... 
+0

谢谢你,非常友善。我认为这会很复杂。 – user7940193

0

添加一个字段needToRun默认为true。继续while循环while: !interrupted()& & needToRun。检测到TOUCH_UP时将needToRun设置为false。 这是一个推荐的方法来停止java中的线程。

+0

我用了其他方法,但也谢谢你! – user7940193

0
  • 让你的线程t从案例MotionEvent访问。行动_ UP 做这个定义在全球范围内线程t

  • 加t.interrupt()来区分MotionEvent.ACTION_UP

它看起来像

import android.graphics.Color; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RelativeLayout; 

public class MainActivity extends AppCompatActivity { 

Button flash; 
RelativeLayout layout; 
boolean backgroundisblack; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    backgroundisblack = true; 
    layout = (RelativeLayout)findViewById(R.id.layout); 
    flash = (Button)findViewById(R.id.flash); 
    //Button 
    flash.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Thread t; 
      //button is pressed 
      switch (event.getAction()){ 
       case MotionEvent.ACTION_DOWN:{//thread 
        t = new Thread(){ 
         @Override 
         public void run(){ 
          while(!interrupted()){ 
           try { 
            Thread.sleep(1000); 
            runOnUiThread(new Runnable(){ 
             @Override 
             public void run(){ 
              //action 
              if(backgroundisblack){ 
               layout.setBackgroundColor(Color.WHITE); 
               backgroundisblack = false; 
              }else if (!backgroundisblack){ 
               layout.setBackgroundColor(Color.BLACK); 
               backgroundisblack = true; 
              } 



             } 
            }); 
           }catch (InterruptedException e){ 
            e.printStackTrace(); 
           } 
          } 
         } 
        }; 
        t.start(); 


        break; 
       } 

       //button is released 
       case MotionEvent.ACTION_UP:{ 
        layout.setBackgroundColor(Color.BLACK); 
        t.interrupt() 
        break; 
       } 
      } 
      return false; 
     } 
    }); 

} 
} 
0

,你可以把一个更使用按钮时按下按钮时以及按下按钮时

// this goes somewhere in your class: 
    long lastDown; 
    long lastDuration; 

    ... 

    // this goes wherever you setup your button listener: 
    button.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      lastDown = System.currentTimeMillis(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      lastDuration = System.currentTimeMillis() - lastDown; 
     } 
    } 
    }); 

,从而可以使用thread.interrupt()来停止线程。

相关问题