为什么Asynctask或Runnable的生命周期与Activity的生命周期不同?

时间:2016-09-18 23:16:18

标签: android android-asynctask runnable android-lifecycle ondestroy

例如,如果我们考虑下面的代码段:

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声明了它,它还是没有被销毁?

考虑一下我问的原因。

2 个答案:

答案 0 :(得分:3)

因为活动类在 UI线程 Runnable 上运行, AsyncTask 等在后台线程上运行,与ui线程分开。除非你明确指示它,否则结束Activity不会结束其他线程。

Runnable说明:

  

Runnable 界面应由任何类实现   实例意图由线程执行

AsyncTask说明:

  

AsyncTask 可以正确,轻松地使用UI线程。 这堂课   允许您执行后台操作并在上面发布结果   UI线程,无需操纵线程和/或处理程序。

您还可以通过阅读文档了解有关Threads的更多信息。

答案 1 :(得分:1)

  

即使在该活动中声明它也不会被销毁?

在线程上调用new Handler()(在你的情况下是主线程)时,Handler与线程的Looper消息队列相关联,发送从队列中处理Runnable和消息。这些Runnable和消息都引用了目标Handler。即使Activity&#39; s onDestroy()方法不是&#34;#34;析构函数&#34;,即当方法返回Activity&n; #39; t被立即杀死(see),因为隐含引用Activity作为Runnable的外部类,所以内存不能被GC编辑。 Activity不会在延迟时间内进行GC编辑,即直到RunnableLooper的消息队列中排队并进行处理。< / p>

参考文献:

  1. This Handler class should be static or leaks might occur: IncomingHandler
  2. How to Leak a Context: Handlers & Inner Classes