如果父活动完成(),则可以在AsyncTask中访问活动类范围字段变量

时间:2011-09-09 14:32:37

标签: android android-asynctask

进行一些测试但无法制作调试环境
所以也许有人可以回答这个问题。

在我的Activity我开始AsyncTask 这个AsyncTask写的是Sqlite,需要很长时间。

我想我可以在用户按下“发送”按钮时启动AsyncTask 然后点击后退按钮finish()活动。

我知道即使Activity finish()正确,AsyncTask也会继续运行。

问题是如何让田地保持活力?

如果父finish()

,此代码中的localArrayPeople会发生什么?
private class AsyncTaskDoStuff extends AsyncTask<Long, Integer, Integer> 
{
    ArrayList localArrayPeople;

    @Override
    protected Integer doInBackground(Long... params) {

        this.localArrayPeople =  arrayPeople;

        // Do stuff...
    }
}

我知道我可以/应该使用服务,但要发送到Service的数据/对象数量 真的很多。
我知道这是一个不好的想法,所以请教育目的只是回答问题,不要警告我

2 个答案:

答案 0 :(得分:2)

回答你的问题。 java程序中的对象永远不会“消失”,因此字段不会丢失引用,例如突然开始指向null。只有当没有人引用它们时,GC才会删除对象。

在您的情况下,当Activity停止时,后台线程中的字段不会受到影响。

唯一的问题可能是Android操作系统决定从内存中删除您的应用并杀死所有线程。如果你有一个非常长时间运行的后台线程并且你的应用程序处于非活动状态(=活动未显示),就会发生这种情况。

答案 1 :(得分:1)

回答您的原始问题:+1来@PeterKnego回答。

回答你的上一条评论“我该怎么办,当我完成后让localArrayPeople = null?”:不,你的AsyncTask保存了对Activity的引用,因为每个内部类都拥有对它的外部类的引用(通过隐藏的{ {1}}字段)。

正如我在评论中提到的文章(“Avoiding memory leaks”)所述:

  

如果您不控制,请避免活动中的非静态内部类   他们的生命周期,使用静态内部类并做出弱引用   到里面的活动。

这样使您的AsyncTaskDoStuff类成为静态内部类:

this$0

如果需要在AsyncTask中使用Context对象,请将应用程序上下文传递给AsyncTaskDoStuff构造函数:

private static class AsyncTaskDoStuff extends AsyncTask<Long, Integer, Integer> 

如果您需要阅读一些Activity字段,通过AsyncTaskDoStuff构造函数(或通过其private static class AsyncTaskDoStuff extends AsyncTask<Long, Integer, Integer> { private final Context context; AsyncTaskDoStuff(Context context) { this.context = context; } } // in the activity: AsyncTaskDoStuff async = new AsyncTaskDoStuff(getApplicationContext()); 方法)传递它们,同样适用。

如果需要在AsyncTask.doInBackground方法中修改Activity字段,请执行以下操作:

execute