我的View组件中的一个线程:何时停止线程?

时间:2011-09-05 11:09:35

标签: android view

我为android创建了一个View组件。该组件有自己的线程来使后台工作。我在View构造函数中启动线程。 我应该在哪里停止线程? onDetachedFromWindow是一个正确的地方吗?

3 个答案:

答案 0 :(得分:0)

stop()方法是deprecated。检查一下:

http://developer.android.com/reference/java/lang/Thread.html#stop%28java.lang.Throwable%29

你应该完成你的工作并离开它,Android足够聪明,可以照顾它......

答案 1 :(得分:0)

停止视图更新的最佳时间可能是它不再可见时。发生这种情况时,将调用您的活动的onStop()方法,然后您可以调用在自定义视图中编写的方法来关闭其更新线程。

// Activity.java
public void onStop() {
   myThreadedView.shutdown();
   ... // rest of onStop() here
}

// ThreadedView.java
public void shutdown() {
   myViewThread.shutdown();
}

// ViewThread.java
bool stop = false;

public void shutdown() {
   stop = true;
}

public void run() {
   while (!stop) {
      updateView();
   }
}

答案 2 :(得分:0)

我会按以下方式执行此操作,前提是ThreadView拥有Surface期间必须处于活动状态并将其用于绘图:

public class MyView extends View {
    class MyThread extends Thread {
        private boolean mActive = true;

        public void run() {
            while (mActive) {
                doThings();
            }
        }

        public void terminate() {
            mActive = false;
        }

        private void doThings() {
            // the things your thread should do
        }
    }

    private MyThread mBackgroundOperation = null;

    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        mBackgroundOperation = new MyThread();
        mBackgroundOperation.start();
    }

    protected void onDetachedFromWindow() {
        mBackgroundOperation.terminate();
        mBackgroundOperation = null;

        super.onDetachedFromWindow();
    }
}

如果不是这种情况(如果Thread的生命周期不直接依赖于使用View的{​​{1}}进行绘图),我会考虑处理它位于Surface内,可能会考虑将其移至使用此View的{​​{1}}。 “也许”,因为如果不知道Activity实际上做了什么,这是一件很难确定的事情。