Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我的视图组件中的线程:何时停止线程?_Android_View - Fatal编程技术网

Android 我的视图组件中的线程:何时停止线程?

Android 我的视图组件中的线程:何时停止线程?,android,view,Android,View,我为android创建了一个视图组件。该组件有自己的线程使后台工作。我在视图构造函数中启动线程。 我应该在哪里停止线程?onDetachedFromWindow是一个正确的位置吗?停止方法已被弃用。选中此项: 你应该完成你的工作然后离开,Android足够聪明来处理它。停止视图更新的最佳时间可能是视图不再可见的时候。发生这种情况时,将调用活动的onStop方法,从那里可以调用在自定义视图中编写的方法来关闭其更新线程 // Activity.java public void onStop() {

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

停止方法已被弃用。选中此项:


你应该完成你的工作然后离开,Android足够聪明来处理它。

停止视图更新的最佳时间可能是视图不再可见的时候。发生这种情况时,将调用活动的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();
   }
}

如果在视图具有曲面并用于绘制时线程必须处于活动状态,我将按以下方式执行此操作:

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();
    }
}

如果不是线程生命周期不直接依赖于视图表面的绘制,我会考虑在视图中处理它,并且可能会考虑将其移动到使用该视图的活动中。可能是因为在不知道该线程的实际功能的情况下很难确定这一点。

不客气,@user618525!很高兴能提供帮助: