2

我的问题是……我有 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

4 回答 4

1

如果你创建了一个引用,你可以从你班级的任何地方访问它。所以,在类正文广告中,类似

Thread thrd 

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

thrd = new Thread(new Runnable(){

现在,您可以引用您的线程,您可以在课堂上的任何地方使用。

于 2013-02-22T12:05:30.817 回答
1
  1. 在你的类中声明一个boolean mRunnning,这就像一个标志,自定义运行线程将依赖它来了解它是否已被取消。

  2. 像往常一样,您的线程中有一个循环,而不是while(true)do while(mRunning)

  3. 此外,您正在使线程睡眠,在睡眠期间,线程将无法检查mRunning变量,您将不得不调用interrupt()线程对象以使其停止。

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

  5. 所以,现在要停止你的线程,你必须调用mRunning = falsethen t.interrupt()

于 2013-02-22T12:08:04.490 回答
1

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

myThread = new Thread(new Runnable

对?

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

myThread.start();

你应该在你的类中声明myThread为全局的,这样你就可以从你类中的任何地方访问这个线程。现在你可以停止线程onClick

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

于 2013-02-22T13:15:45.893 回答
0

而不是
while(true)

在 run() 方法中,声明一个布尔变量为 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;
                      .
                      .
                      .
于 2013-02-22T12:09:14.373 回答