在另一个事件中停止线程

时间:2013-02-22 11:56:52

标签: android multithreading

我的问题是...... 我有2个活动.. onCreate和Onclick。我有一个在onCreate里面运行的线程,我必须在onClick里面停止它。这可能吗? 如果是,请向我提供一些提示/代码片段如何实现这一点。

我在onCreate事件中的代码是: -

protected void onCreate(Bundle savedInstanceState) {

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

    button = (Button) findViewById(R.id.btn);
        button.setOnClickListener(this);
        try{
            bright = Settings.System.getInt(getContentResolver(), 
                     Settings.System.SCREEN_BRIGHTNESS);
            }catch(Exception ex){
                ex.printStackTrace();
                bright = 1.0f;
            }


        lp = getWindow().getAttributes();
         new Thread(new Runnable(){

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                try {
                    Thread.sleep(10000);
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            lp.screenBrightness= dim;
                            getWindow().setAttributes(lp);
                            // SLEEP 2 SECONDS HERE ...
                            final Handler handler = new Handler(); 
                            Timer t = new Timer(); 

                            t.schedule(new TimerTask() { 
                                    public void run() { 
                                            handler.post(new Runnable() { 
                                                    public void run() { 
                                                    lp.screenBrightness=bright;
                                                    getWindow().setAttributes(lp);
                                                    } 
                                            }); 
                                    } 
                            }, 2000); 

                        }
                    });
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }

        }

      }).start();  

    }

此活动在循环内运行。我想停止这一点,我点击按钮。看来我无法在按钮onclick事件中调用Thread.interrupt()方法。我该如何处理?

4 个答案:

答案 0 :(得分:1)

如果您创建了引用,则可以从类中的任何位置访问它。所以,在课堂上的广告中就像是

Thread thrd 

就像你使用Button,TextView或其他任何东西一样。然后在onCreate方法中添加像

这样的引用
thrd = new Thread(new Runnable(){

现在您可以参考您的课程中可以使用的线程。

答案 1 :(得分:1)

  1. 在你的类中声明boolean mRunnning,这就像一个标志,自定义运行的线程将依赖于它来知道它是否已被取消。

  2. 像往常一样,你的帖子中有一个循环,而不是while(true)while(mRunning)

  3. 此外,你正在让你的线程休眠,在睡眠期间,线程将无法检查mRunning变量,你将不得不在线程对象上调用interrupt()来使它成为停止。

  4. 最好使用变量来保存线程引用Thread t = new Thread(....

  5. 所以,现在要停止你的主题,你必须拨打mRunning = false然后t.interrupt()

答案 2 :(得分:1)

根据您目前的情况根据之前的答案评论。你想尝试:

myThread = new Thread(new Runnable

正确?

然后你也应该删除以前编码的.start();部分。然后写:

myThread.start();

你应该在你的班级中将myThread声明为全局,这样你就可以从班级的任何地方访问这个帖子。现在你可以在onClick

中停止线程了

你应该把这个答案和User117的答案结合在一起。

答案 3 :(得分:0)

而不是
         而(真)

在run()方法中,将boolean变量声明为true并在onClick之后更改它。例如:

     private boolean shouldRun = true; 

然后在run()方法中:

      @Override
    public void run() {
        // TODO Auto-generated method stub
        while (shouldRun==true) {
                     .
                     . 
                     .

并在你的onClick:

        @override
          public void OnClick(View v){

              shouldRun=false;
                      .
                      .
                      .