例如,如果我们考虑下面的代码段:
public class HandlerExample extends AppCompatActivity {
private Handler mLeakyHandler = new Handler();
private TextView myTextBox;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_samples);
myTextBox = (TextView) findViewById(R.id.tv_handler);
// Post a message and delay its execution for 10 seconds.
mLeakyHandler.postDelayed(new Runnable() {
@Override
public void run() {
myTextBox.setText("Done");
}
}, 1000 * 10);
}
}
当Activity
被破坏时,无论是通过配置更改还是其他原因,Runnable
都不会。 Asynctask
s也是如此。
我的问题是,即使在Activity
声明了它,它还是没有被销毁?
考虑一下我问的原因。
答案 0 :(得分:3)
因为活动类在 UI线程和 Runnable 上运行, AsyncTask 等在后台线程上运行,与ui线程分开。除非你明确指示它,否则结束Activity不会结束其他线程。
Runnable说明:
Runnable 界面应由任何类实现 实例意图由线程执行。
AsyncTask说明:
AsyncTask 可以正确,轻松地使用UI线程。 这堂课 允许您执行后台操作并在上面发布结果 UI线程,无需操纵线程和/或处理程序。
您还可以通过阅读文档了解有关Threads的更多信息。
答案 1 :(得分:1)
即使在该活动中声明它也不会被销毁?
在线程上调用new Handler()
(在你的情况下是主线程)时,Handler
与线程的Looper
消息队列相关联,发送从队列中处理Runnable
和消息。这些Runnable
和消息都引用了目标Handler
。即使Activity
' s onDestroy()
方法不是"#34;析构函数",即当方法返回Activity
&n; #39; t被立即杀死(see),因为隐含引用Activity
作为Runnable
的外部类,所以内存不能被GC编辑。 Activity
不会在延迟时间内进行GC编辑,即直到Runnable
从Looper
的消息队列中排队并进行处理。< / p>
参考文献: