2

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

1 回答 1

0

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

当您的 Activity 失去焦点时,系统调用onPause()后跟onStop(). 应用程序通过覆盖Activity. 因此,在onPause()或中onStop(),您应该添加:

    DownloadWebPageTask.cancel(true)

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

[更新] 你也可以在onDestroy()Activity 被杀死时调用它。

[更新] 如果您只想在用户滑动时取消任务,则使用这样的onFling()事件监听器:

    SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){

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

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

于 2013-01-08T11:36:30.470 回答