在onPostExecute中创建的适配器中使用onClickListener启动取消asynctask

时间:2014-03-10 12:07:07

标签: java android android-asynctask

这是我的上下文:我有一个活动,可以下载视频列表并将其设置为适配器。当用户点击每个项目时,应用程序会在外部应用程序中下载和流式传输视频。 所以,让我们看一些代码。主要活动有:

new TvAsyncTask(getActivity(), gridView, progressBar).execute();

TvAsyncTask下载视频列表并将其设置为:

protected void onPostExecute(ArrayList<VideoPreviewData> list) {
        progressBar.setVisibility(View.INVISIBLE);

        final TvListAdapter adapter = new TvListAdapter(activity.getApplicationContext(), R.layout.item_video_list, list);

        videoGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
              public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
                  String videoUrl = adapter.getItem(position).getLink();
                  //Launch asyncTask to download video an load it into an external media player
                  new GetVideoAsyncTask(activity).execute(videoUrl);                  
              }
            });
        if (videoGridView!=null) videoGridView.setAdapter(adapter);
}

GetVideoAsyncTask加载视频链接并在外部应用程序中输入Intent来传输该视频。为了做到这一点,在onLoading期间我设置了一个ProgressDialog,向用户显示一条加载消息。加载完成后,意图启动。

问题 当显示ProgressDialog并且用户单击“后退按钮”时,对话框将被取消,但是asynctask继续工作。所以当它完成它启动意图。 我想阻止这个。我在MainActivity中有一个onPause方法,但我没有从适配器启动的GetVideoAsyncTask的引用。所以我不能调用方法AsyncTask.cancel(true)来拒绝意图启动。 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

创建异步任务类的对象;

TvAsyncTask tvTask = new TvAsyncTask(getActivity(), gridView, progressBar);
tvTask.execute();

然后在TvAsyncTask类中覆盖onCanceled函数

@Override
        protected void onCancelled() 
        {
super.onCancelled();
}

在后退按钮代码中检查:

if(tvTask != null)
tvTask.cancel(true);

答案 1 :(得分:0)

在主要活动中,您可以保留对GetVideoAsyncTaskTvAsyncTask的引用,并在onPause中取消它们。

不活动:

GetVideoAsyncTask getVideoAsyncTask;
TvAsyncTask tvAsyncTask;
在onCreate中

tvAsyncTask=new TvAsyncTask(getActivity(), gridView, progressBar);
tvAsyncTask.execute();

和onItemClick

getVideoAsyncTask=new GetVideoAsyncTask(activity); 
getVideoAsyncTask.execute(videoUrl);
onPause中的

if(tvAsyncTask!=null&&!tvAsyncTask.isCancelled())
tvAsyncTask.cancel(true);
if(getVideoAsyncTask!=null&&!getVideoAsyncTask.isCancelled())
getVideoAsyncTask.cancel(true);