저는 ViewPager에 다른 프래그먼트가있는 어플리케이션을 작성하고 있습니다. 각 조각에서 나는 웹 서버로부터 데이터를 가져 오는 데 몇 개의 AsyncTask를 사용한다. 조각 중 일부는 동일한 AsynTask (서비스)를 호출해야하지만, 그 중 하나가 이미 호출 한 경우 서비스가 응답하는 데 시간이 걸리므로 호출하지 못하게하려고합니다. 대신 AsyncTask에서 그것을 불렀던 모든 조각들에게 결과. 또한 사용자가 조각 (SwipeToRefresh)을 업데이트 할 때 모든 조각에서 데이터를 업데이트해야합니다. 내가 오늘 가지고있는 aproach 함수는 호출 된 서비스가 유효한지 확인하는 함수이며, 그렇지 않은 경우 서비스가 호출되었음을 나타내는 플래그를 저장하고 AsyncTask를 사용하여 호출하는 콜백 인터페이스를 사용하는 서비스를 호출합니다. 결과를 요청하는 Fragmnet으로 보내고 다른 방법으로 서비스가 이미 호출 된 경우 Callback 목록에 콜백을 추가합니다. 콜백 목록은 나중에 AsyncTask.onPostExecute에서 통과하여 모든 가상 네트워크에 다시 전달합니다.하나의 AsynckTask에 대한 다중 콜백
가장 큰 문제는 사용자가 잠시 후 앱을 열 때와 같이 메모리 누수가 발생하고 (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);
}
}
} 난 당신이 날 도울 수 있기를 바랍니다
나는 오타에 대해 사과 나 문법 오류가 내가있을 수 있습니다 끝난.