【发布时间】:2020-04-24 14:53:15
【问题描述】:
在 MessageFeedActivity onCreate 方法中,它通过调用 CTFeedAPI 类的 getMessageTypes 方法来加载提要。
public class MessageFeedActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Setting the listener
CTFeedAPI ctFeedAPI = new CTFeedAPI(new CTFeedAPI.CTFeedAPIListener() {
@Override
public void feedAPISuccessListener(Object object) {
// Handle Success
}
@Override
public void feedAPIErrorListener(int error) {
// Handle Error
}
});
ctFeedAPI.getMessageTypes();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
并等待 CTFeedAPIListener 响应。 CTFeedAPI 类通过调用 NetworkRequest 类的 performRequest 方法发出网络请求
public class CTFeedAPI implements NetworkListener {
private CTFeedAPIListener apiListener;
public CTFeedAPI(CTFeedAPIListener feedAPIListener) {
apiListener = feedAPIListener;
}
public void getMessageTypes() {
Map < String, String > params = new HashMap < > ();
params.put("f", "GetMessageTypes");
NetworkRequest networkRequest = new NetworkRequest(this);
networkRequest.performRequest();
}
public interface CTFeedAPIListener {
void feedAPISuccessListener(Object object);
void feedAPIErrorListener(int error);
}
}
并等待 NetworkListener 响应
public class NetworkRequest {
private NetworkListener mListener;
public interface NetworkListener {
void networkReqSuccessListener(String cacheKey, String tag, String response);
void networkReqErrorListener(String tag, int error);
}
public NetworkRequest(NetworkListener listener) {
this.mListener = listener;
}
public void performRequest(
// Perform Network Requests and respond as
if (mListener != null) {
if (success) {
mListener.networkReqSuccessListener(getUrl(), getTag(), response);
} else {
mListener.networkReqErrorListener(getTag(), err_msg);
}
}
}
当用户按下返回键时,在销毁MessageFeedActivity之前,系统调用'onDestroy'方法。不幸的是,由于后台线程(NetworkRequest 类中的 performRequest 方法)仍然保留对它的引用,所以会发生泄漏。
那么如何在 MessageFeedActivity 中实现 CTFeedAPIListener 引用来消除泄漏。
【问题讨论】:
标签: java android android-activity memory-leaks listener