Android 当用户滑动屏幕时,停止执行AsyncTask的doInbackground()方法
在我的android应用程序中,我在线获取歌词。此任务在后台使用AsyncTask类执行。在doInbackground()中,我正在调用另一个类的方法来获取歌词。我想使用AsyncTask的cancel()方法停止从当前活动中执行另一个类的方法。但它不会在当前活动之外停止方法的执行。有没有办法停止执行该方法执行 这是我的密码Android 当用户滑动屏幕时,停止执行AsyncTask的doInbackground()方法,android,android-asynctask,Android,Android Asynctask,在我的android应用程序中,我在线获取歌词。此任务在后台使用AsyncTask类执行。在doInbackground()中,我正在调用另一个类的方法来获取歌词。我想使用AsyncTask的cancel()方法停止从当前活动中执行另一个类的方法。但它不会在当前活动之外停止方法的执行。有没有办法停止执行该方法执行 这是我的密码 public class musicplayer extends Activity { DownloadWebPageTask tas
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);
}
}
}
公共类MusicLayer扩展活动
{
下载网页任务;
公共void播放歌曲(int歌曲索引)
{
任务=新下载的WebPagetTask();
执行(新字符串[]{title,artist});
}
私有类下载WebPagetTask扩展异步任务
{
@凌驾
受保护的void onPreExecute()
{
尝试
{
super.onPreExecute();
progressBar=(progressBar)findViewById(R.id.showLoading);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
@凌驾
受保护的字符串doInBackground(字符串…arg0)
{
尝试
{
如果(!isCancelled())
{
//获取歌词
lyricsArray=SearchHelper.findLyrics(arg0[0],arg0[1]);
publishProgress(输出字符串);
}
其他的
{
系统输出打印(“取消”);
}
}
捕获(例外情况除外){
例如printStackTrace();
}
返回星光大道;
}
@凌驾
受保护的void onProgressUpdate(字符串…st)
{
super.onProgressUpdate(st);
progressBar.setVisibility(View.GONE);
tvMain.setText(Html.fromHtml(st[0].toString());
}
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY)
{
尝试
{
任务。取消(true);
播放歌曲(当前歌曲索引+1);
}
}
}
我假设当您的主要活动未运行或不是用户关注的焦点时,您希望停止您的异步任务。基于此:
当您的活动失去焦点时,系统调用onPause()
,然后调用onStop()
。应用程序通过覆盖活动的这两个函数来完成所有清理。因此,无论是在onPause()
还是onStop()
,您都应该添加:
DownloadWebPageTask.cancel(true)
要使其工作,您应该具有对任务类的static
访问权限
[更新]您还可以在onDestroy()
中执行此操作,该操作在活动终止时调用
[更新]如果只想在用户刷卡时取消任务,请使用onFling()
事件侦听器,如下所示:
SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,){
// handle swipe event
}
};
还要检查是否要检测小部件上的滑动是否尝试在Activity onpause中取消AsyncTask执行?但是..此代码无效。仍然调用了另一个类的方法。是否调用了onFling()?记录Log.d
。是..调用..和{task.cancle(true);}也会执行,但若我快速滑动屏幕,则后台进程不会正确停止。