Java 暂停的活动实例上的对象范围和主动清理

Java 暂停的活动实例上的对象范围和主动清理,java,android,android-activity,garbage-collection,android-asynctask,Java,Android,Android Activity,Garbage Collection,Android Asynctask,我有一个活动,其中包含一个作为内部类的AsyncTask(正如我在大多数示例中看到的)。如果启动AsyncTask,然后通过导航离开它来暂停活动,AsyncTask将继续执行。据我所知,这是正常和预期的行为 活动中有一个成员变量,该变量由AsyncTask的方法调用访问。当AsyncTask在后台执行时,当它的活动暂停时,我刚刚得到一个NullPointerException,在我看来,它是由GC在活动暂停时收集的。在我看来,该对象不应被视为超出范围。活动中仍有代码在运行,那么为什么活动的成员变

我有一个活动,其中包含一个作为内部类的AsyncTask(正如我在大多数示例中看到的)。如果启动AsyncTask,然后通过导航离开它来暂停活动,AsyncTask将继续执行。据我所知,这是正常和预期的行为

活动中有一个成员变量,该变量由AsyncTask的方法调用访问。当AsyncTask在后台执行时,当它的活动暂停时,我刚刚得到一个NullPointerException,在我看来,它是由GC在活动暂停时收集的。在我看来,该对象不应被视为超出范围。活动中仍有代码在运行,那么为什么活动的成员变量已经开始清理

通过作为活动内部类的AsyncTasks访问的活动成员变量的推荐用法是什么

下面是我的对象所具有的关系类型的示例

public class MyActivity {

    MyCustomService myCustomService;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.some_layout);

        myCustomService = ServiceLocator.getInstance(MyCustomService.class);
    }

private class FetchDataTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... arg0) {     

        String data = someOtherService.fetchSomeData(); 
        return data;
    }

    @Override
    protected void onPostExecute(String result) {

        refreshControls(result);
    }       
}

private void refreshControls(String result) {   
    // this is where the object is null after aggressive cleanup
    myCustomService.someMethod();   
}
公共类MyActivity{
MyCustomService MyCustomService;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.some_布局);
myCustomService=ServiceLocator.getInstance(myCustomService.class);
}
私有类FetchDataTask扩展了AsyncTask{
@凌驾
受保护字符串doInBackground(Void…arg0){
String data=someOtherService.fetchSomeData();
返回数据;
}
@凌驾
受保护的void onPostExecute(字符串结果){
刷新控制(结果);
}       
}
私有控件(字符串结果){
//这是主动清理后对象为空的位置
myCustomService.someMethod();
}

我真的不明白是什么导致了
NullPointerException

但是,您可能需要检查
异步任务
,该任务不是活动的内部类,而是
静态
。启动的内部异步任务在运行时会泄漏上下文/活动。对于短期运行的任务,这可能没有问题,但如果它阻塞或执行很长时间,则会泄漏t的内存帽子时间


这可能意味着你的问题的答案…

谢谢你的回答。我真的不需要提供stacktrace,因为我可以准确地解释发生了什么,stacktrace也不会说太多。通常,此对象在范围内,不会指向空引用。但是,当我暂停活动并在应用程序中移动时g当系统内存不足时,系统将垃圾收集我的活动的此成员变量,因为该活动已暂停。我已测试在正常执行下没有null ref。我的问题是,该对象应该存在于何处?我可以简单地将其标记为final吗?或者,我只检查null。如果该对象为null,活动已暂停,我不应该执行代码(无需更新UI)。然后我可以在onResume中获取对我对象的引用,而不是onCreate,这样我就可以确信我始终有一个有效的对象实例。嗯,这似乎很奇怪。如果您的任务正在运行,并且确实引用了活动,只要它存在,GC就不应该丢弃您的活动及其属性。您确定吗你没有在暂停时禁用
myCustomService
,或者它以某种方式被禁用吗?没有,我以前见过这种情况,但在开发过程中从未如此明确过。我在发布的应用程序中随机出现过这种行为,但我现在有一个特定的可重复场景。这与描述的完全一样,我的问题是如何组织了解这一点后,请重新整理我的对象图。此应用程序与我以前见过的已发布应用程序之间的区别在于,此新应用程序使用了大量内存,因此更易于重复。另一个应用程序很轻,但可能在较旧的设备上使用了GC,因此我无法复制它。我可能会按照注释2中的说明继续操作^