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

时间:2013-01-08 11:05:58

标签: android android-asynctask

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

这是我的代码..

    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);
                     }
                } 
}

1 个答案:

答案 0 :(得分:0)

我假设您想要在主要活动未运行或不是用户关注时停止AsyncTask。基于此:

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

    DownloadWebPageTask.cancel(true)

为此,您应该static访问Task类。

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

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

    SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){

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

如果您想检测小部件上的滑动,请查看Gesture Overlay View