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メインのアクティビティが実行されていないとき、またはユーザーの焦点では​​ないときに、停止したいと思います。それに基づいて:

アクティビティがフォーカスを失うと、システムコールのonPause()後に。が続きonStop()ます。アプリケーションは、のこれら2つの機能をオーバーライドすることにより、すべてのクリーンアップを実行します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
         }
    };

ウィジェット上でのスワイプを検出する場合は、ジェスチャオーバーレイビューも確認してください

于 2013-01-08T11:36:30.470 に答える