我有一个活动,它将打开一个自定义对话框,该自定义对话框在创建后会启动一个异步任务,该任务将加载将显示的信息。
如果用户在完全加载之前关闭对话框,活动,应用程序或其他任何内容,我希望异步任务停止加载。
这就是我的做法:
活动:
new UsernamesListDialog().show(getSupportFragmentManager(), USERNAMES_LIST_DIALOG_TAG);
public class UsernamesListDialog extends AppCompatDialogFragment implements CompoundButton.OnCheckedChangeListener, View.OnClickListener, LoadFollowersTask.LoadFollowersListener {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
new LoadFollowersTask(this, this.progressBar, this.progressCaption, APIFacade.getInstance().getLocalUser()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, APIFacade.getInstance());
return v;
}
public class LoadFollowersTask extends AsyncTask<APIFacade, Integer, Set<BasicUser>> {
protected Set<BasicUser> doInBackground(APIFacade... api) {
while (loaded.size() < totalToLoad && this.listener.isAlive()) {
//load stuff
}
return result;
this.listener
是自己的对话框,方法isAlive()
是:
public boolean isAlive(){
return this.isVisible();
}
问题是:
由于任务是异步的,在对话框正确显示到界面之前,LoadFollowersTask
可能会停留一会儿,在这种情况下,任务将自行停止并返回空结果。
因此,我需要将isAlive
重新定义为从创建对话框到关闭对话框将返回true的值。
我应该使用哪种方法?
答案 0 :(得分:1)
您应该尝试使用Dialog方法setOnShowListener
和setOnDismissListener
。
在类UsernamesListDialog的getDialog()
内调用onViewCreated
时,可以获取Dialog对象。
OnShowListener,因此您可以在其中运行AsyncTask。 当Dialog关闭时,将调用OnDismissListener,因此您可以取消任何未完成的AsyncTask。