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



在我的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);
                     }
                } 
}

我假设你想停止你的AsyncTask时,你的主要活动没有运行或不是用户的焦点。基于此:

当你的活动失去焦点时,系统调用onPause(),然后是onStop()。应用程序通过覆盖Activity的这两个函数来完成所有的清理工作。所以在onPause()onStop()中,你应该添加:

    DownloadWebPageTask.cancel(true)

要使其工作,您应该有static访问Task类。

[Update]你也可以在onDestroy()中这样做,当活动被杀死时调用。

[Update]如果你想只在用户滑动时取消任务,那么使用onFling()事件监听器,像这样:

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

也检查手势叠加视图,如果你想检测滑动的小部件

相关内容

  • 没有找到相关文章

最新更新