【发布时间】:2017-06-20 14:06:21
【问题描述】:
我正在编写一个应用程序,其中我在 ViewPager 中有不同的片段。在每个片段中,我使用几个 AsyncTask 从 Web 服务器获取数据。一些片段需要调用相同的 AsynTask(service),但如果其中一个已经调用它,因为服务需要一段时间才能响应,我想防止再次调用它,而是让 AsyncTask 发送结果到所有调用它的片段。当用户更新片段(即SwipeToRefresh)时,我还需要更新所有片段中的数据。我今天使用的方法是一个函数,我验证服务是否已被调用,如果不是,则保存一个标志以指示该服务已被调用,并使用接收回调接口的 AsyncTask 调用服务以发送结果到请求的 Fragmnet,如果在另一方面,服务已经被调用,则将 Callback 添加到 Callback 列表中,稍后在 AsyncTask.onPostExecute 中遍历该列表以将结果发送到所有 Fragmnet。
最大的问题是当我多次请求时,比如用户在一段时间后打开应用程序时,会导致内存泄漏(GC 工作太多,应用程序冻结)并且应用程序被终止。它也不能解决在一次调用中更新所有片段的问题。
这是我之前提到的程序的代码(只是一个例子):
public class Test {
private static List<Integer> calledServices = new ArrayList<>();
private static Map<Integer, List<Callback>> callbacksMap = new HashMap<>();
public static void call(int serviceId, Callback callback) {
if (!hasBeenCalled(serviceId)) {
calledServices.add(serviceId); //saves flag
ServiceAsyncTask task = new ServiceAsyncTask(serviceId, callback);
task.execute();
} else {
callback.onPreExecute();
if (callbacksMap.containsKey(serviceId)) {
callbacksMap.get(serviceId).add(callback);
} else {
List<Callback> callbacks = new ArrayList<>();
callbacks.add(callback);
callbacksMap.put(serviceId, callbacks);
}
}
}
private static boolean hasBeenCalled(int serviceId) {
return calledServices.contains(serviceId);
}
interface Callback {
void onPreExecute();
void onPostExecute(Object object);
}
static class ServiceAsyncTask extends AsyncTask<Object, Object, Object> {
private final int serviceId;
private final Callback mCallback;
ServiceAsyncTask(int serviceId, Callback callback) {
this.serviceId = serviceId;
this.mCallback = callback;
}
@Override
protected void onPreExecute() {
mCallback.onPreExecute();
}
Object doInBackground(Object... params) {
return WebService.call(serviceId);
}
@Override
protected void onPostExecute(Object o) {
mCallback.onPostExecute(o);
if (!callbacksMap.containsKey(serviceId)) return;
for (Callback callback : callbacksMap.get(serviceId)) {
callback.onPostExecute(o);
}
callbacksMap.remove(serviceId);
calledServices.remove(serviceId);
}
}
}
我希望你能帮助我,对于我可能犯的任何拼写错误或语法错误,我深表歉意。
【问题讨论】:
标签: java android android-fragments android-asynctask