我的问题是,当作为参数传递给异步回调时,我们应该如何使用匿名类? 例如,如果我有以下代码:
interface MyListener {
void onSucces(String requestedAction, JSONObject response);
void onError(String requestedAction, JSONObject response, int statusCode);
};
interface CallbackInterface {
void onResponse(String requestedAction, JSONObject response, int statusCode);
};
void doAsyncJob(String action, CallbackInterface callbackItf);
void makeJob(String action, final MyListener listener) {
doAsyncJob(action, new CallbackInterface {
void onResponse(String requestedAction, JSONObject response, int statusCode) {
if (statusCode == 200) {
listener.onSucces(requestedAction, response);
} else {
listener.onError(requestedAction, response, statusCose);
}
}
});
}
for(i = 1; i < 1000; i++) {
makeJob("Action_" + i, new MyListener{
void onSucces(String requestedAction, JSONObject response) {
//process response
}
void onError(String requestedAction, JSONObject response, int statusCode) {
//process error
});
}
通过分配每次新的侦听器(MyListener)来循环调用“ makeJob”, “ onResponse”,此侦听器有资格成为垃圾收集器吗? 是否需要保留对此侦听器的一种引用,以确保稍后在“ onResponse”中使用该侦听器时未将其丢弃?
答案 0 :(得分:1)
当没有其他对象引用对象时,这些对象将有资格进行垃圾回收。
在您的情况下,MyListener
对象被传递到makeJob,然后由CallbackInterface
对象引用。请注意,引用不必是在CallbackInterface
中明确声明的成员变量(实际上,Java运行时会生成一个并复制引用)。
只要CallbackInterface
对象存在,其关联的MyListener
就不会被垃圾回收。这意味着只要doAsyncJob在作业运行期间一直保持对CallbackInterface
的引用,那么MyListener
将始终可用。