Android 当用户滑动屏幕时,停止执行AsyncTask的doInbackground()方法

Android 当用户滑动屏幕时,停止执行AsyncTask的doInbackground()方法,android,android-asynctask,Android,Android Asynctask,在我的android应用程序中,我在线获取歌词。此任务在后台使用AsyncTask类执行。在doInbackground()中,我正在调用另一个类的方法来获取歌词。我想使用AsyncTask的cancel()方法停止从当前活动中执行另一个类的方法。但它不会在当前活动之外停止方法的执行。有没有办法停止执行该方法执行 这是我的密码 public class musicplayer extends Activity { DownloadWebPageTask tas

在我的android应用程序中,我在线获取歌词。此任务在后台使用AsyncTask类执行。在doInbackground()中,我正在调用另一个类的方法来获取歌词。我想使用AsyncTask的cancel()方法停止从当前活动中执行另一个类的方法。但它不会在当前活动之外停止方法的执行。有没有办法停止执行该方法执行

这是我的密码

    public class musicplayer extends Activity
    {
          DownloadWebPageTask task;

          public void playSong(int songIndex)
          {
             task = new DownloadWebPageTask();
             task.execute(new String[] { title, artist });
          }
          private class DownloadWebPageTask extends AsyncTask<String, String, String> 
          {
              @Override
              protected void onPreExecute() 
              {
            try 
            {
                super.onPreExecute();
                progressBar = (ProgressBar) findViewById(R.id.showLoading);
                } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
            }
            @Override
            protected String doInBackground(String... arg0) 
            {
                try 
            {
                 if(! isCancelled())
                 {
                // get lyrics
                lyricsArray = SearchHelper.findLyrics(arg0[0], arg0[1]);
                        publishProgress(OutputString);
                     }
                 else
                 {
                System.out.print("Cancelled");
                 }
            }
            catch (Exception ex) {
                                ex.printStackTrace();
                }

                return artistArray;
            }
                @Override
            protected void onProgressUpdate(String... st) 
            {
                super.onProgressUpdate(st);
                progressBar.setVisibility(View.GONE);
                        tvMain.setText(Html.fromHtml(st[0].toString()));

                 }
                @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float                             velocityX,float velocityY) 
        {
                 try 
             {
                        task.cancel(true);
            playSong(currentSongIndex + 1);
                     }
                } 
}
公共类MusicLayer扩展活动
{
下载网页任务;
公共void播放歌曲(int歌曲索引)
{
任务=新下载的WebPagetTask();
执行(新字符串[]{title,artist});
}
私有类下载WebPagetTask扩展异步任务
{
@凌驾
受保护的void onPreExecute()
{
尝试
{
super.onPreExecute();
progressBar=(progressBar)findViewById(R.id.showLoading);
} 
捕获(例外e)
{
e、 printStackTrace();
}
}
@凌驾
受保护的字符串doInBackground(字符串…arg0)
{
尝试
{
如果(!isCancelled())
{
//获取歌词
lyricsArray=SearchHelper.findLyrics(arg0[0],arg0[1]);
publishProgress(输出字符串);
}
其他的
{
系统输出打印(“取消”);
}
}
捕获(例外情况除外){
例如printStackTrace();
}
返回星光大道;
}
@凌驾
受保护的void onProgressUpdate(字符串…st)
{
super.onProgressUpdate(st);
progressBar.setVisibility(View.GONE);
tvMain.setText(Html.fromHtml(st[0].toString());
}
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY)
{
尝试
{
任务。取消(true);
播放歌曲(当前歌曲索引+1);
}
} 
}

我假设当您的主要活动未运行或不是用户关注的焦点时,您希望停止您的
异步任务。基于此:

当您的活动失去焦点时,系统调用
onPause()
,然后调用
onStop()
。应用程序通过覆盖
活动的这两个函数来完成所有清理。因此,无论是在
onPause()
还是
onStop()
,您都应该添加:

    DownloadWebPageTask.cancel(true)
要使其工作,您应该具有对任务类的
static
访问权限

[更新]您还可以在
onDestroy()
中执行此操作,该操作在活动终止时调用

[更新]如果只想在用户刷卡时取消任务,请使用
onFling()
事件侦听器,如下所示:

    SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){

         @Override
         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,){
          // handle swipe event
         }
    };

还要检查是否要检测小部件上的滑动

是否尝试在Activity onpause中取消AsyncTask执行?但是..此代码无效。仍然调用了另一个类的方法。是否调用了onFling()?记录
Log.d
。是..调用..和{task.cancle(true);}也会执行,但若我快速滑动屏幕,则后台进程不会正确停止。