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