Iv'e는 목록 활동을 사용하여 인터넷에서 가져온 항목 목록을 표시하는 Android 앱을 가지고 있습니다. 먼저 AsyncTask를 사용하여 목록을로드하고 Async 작업이 완료되면 다른 비동기 작업이 호출되어 목록 항목과 함께가는 축소 그림을로드합니다. 내가 겪고있는 문제는 사용자가 언제든지 누를 수있는 새로 고침 단추에 액세스 할 수 있고 누를 때 항목의 전체 목록이 삭제되고 로딩이 다시 시작된다는 것입니다. 미리보기 이미지를로드하는 비동기 작업은 이러한 상황이 발생할 경우 계속 실행될 수 있으며 기존 목록 항목에 미리보기 이미지를 추가하려고 시도 할 수 있습니다. Iv'e는 목록에서 동기화를 시도했습니다. 부울을 사용하여 연구 한 후에 작동하지 않는다고 깨달았습니다. 또한 thumbnail 로더를 취소하기 위해 새로 고침이 발생했는지 확인하기 위해 정적 원자 부울을 사용해 보았습니다. 어떤 아이디어? 도움이 될AsyncTasks가 실행 중일 때 새로 고침 버튼을 선택했는지 감지
public class LoadItems extends AsyncTask<Void, Void, Boolean> {
private Activity activity;
private static boolean loading = false;
public static final AtomicBoolean refreshing = new AtomicBoolean(false);
private static final String TAG = "LoadItems";
private int start;
private List<ListItem> items;
public LoadItems(Activity activity) {
this.activity = activity;
}
@Override
protected void onPreExecute() {
loading = true;
start = ItemViewer.itemList.size();
}
@Override
protected Boolean doInBackground(Void... arg0) {
items = WebFunctions.getMoreItems(activity);
return (items != null);
}
protected void onPostExecute(Boolean success) {
if (success) {
for (ListItem item: items) {
ItemViewer.itemList.add(item);
Log.d(TAG, "added item " + item.getTitle());
}
LoadThumbnails thumbnailLoader = new LoadThumbnails();
thumbnailLoader.execute(start, ItemViewer.itemList.size());
}
loading = false;
}
public void protectedExecute() {
if (!loading)
execute();
}
public void refresh() {
if (!refreshing.getAndSet(true)) {
WebFunctions.reset();
ItemViewer.itemList.removeAllItems();
execute();
}
}
}
public class LoadThumbnails extends AsyncTask<Integer, Void, Drawable> {
private int position;
private int end;
@Override
protected Drawable doInBackground(Integer... params) {
position = params[0];
end = params[1];
Drawable thumbnail = null;
synchronized(ItemViewer.itemList) {
if (LoadItems.refreshing.get())
cancel(true);
String url = ItemViewer.itemList.get(position).getThumbnailUrl();
if (!url.isEmpty())
thumbnail = WebFunctions.loadDrawableFromUrl(ItemViewer.activity, url);
}
return thumbnail;
}
protected void onPostExecute(Drawable d) {
synchronized (ItemViewer.itemList) {
if (LoadItems.refreshing.get())
cancel(true);
if (d != null)
ItemViewer.itemList.setThumbnail(position, d);
position++;
if (position < end) {
LoadThumbnails lt = new LoadThumbnails();
lt.execute(position, end);
}
}
}
}