在我的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
}
};
也检查手势叠加视图,如果你想检测滑动的小部件