Android:在AsyncTask运行时按下后退按钮
我有一个Android:在AsyncTask运行时按下后退按钮,android,android-activity,android-asynctask,Android,Android Activity,Android Asynctask,我有一个活动a,它有一个按钮。单击按钮,将打开另一个活动b onCreate()方法的ActivityB,我正在启动AsyncTask,它连接到服务器,获取结果并显示在屏幕上 以下是活动B的代码: public class ActivityB extends Activity { AsyncFetch asyncFetch; @Override protected void onCreate(Bundle savedInstanceState) { sup
活动a
,它有一个按钮。单击按钮
,将打开另一个活动b
onCreate()
方法的ActivityB
,我正在启动AsyncTask
,它连接到服务器,获取结果并显示在屏幕上
以下是活动B的代码:
public class ActivityB extends Activity {
AsyncFetch asyncFetch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(null != savedInstanceState) {
return;
}
asyncFetch = new AsyncFetch();
asyncFetch.execute();
}
}
private class AsyncFetch extends AsyncTask<Object, Void, Object> {
@Override
protected void onPostExecute(Object o) {
}
@Override
protected Object doInBackground(Object... params) {
//contacts the http server.
}
}
但它仍然等待AsyncTask
取消或完成
比如当我打开某个东西时,GMail应用程序。在这个过程中,如果我按下“后退”按钮,它就会从活动中退出
是否有其他方式实现后台流程?是否有任何设计模式来实现此功能?请让我知道
感谢您的帮助。尝试以下方法:
@Override
public void onBackPressed() {
asyncFetch.cancel(true);
// If you want to finish the activity you can use below code
// finish();
}
只需处理onBackPressed()方法:
我们开始吧。试试这个
@Override
public void onBackPressed() {
if (asyncFetch.getStatus() == AsyncTask.Status.RUNNING) {
asyncFetch.cancel(true);
}
finish();
}
来自android开发者的:
取消任务
可以通过调用cancel(布尔值)随时取消任务。调用此方法将导致对isCancelled()的后续调用返回true。调用此方法后,将在doInBackground(Object[])返回后调用onCancelled(Object),而不是onPostExecute(Object)。为了确保尽快取消任务,您应该始终定期检查doInBackground(Object[])中isCancelled()的返回值,如果可能的话(例如在循环中)
因此,简而言之,您可以在活动中的onPause()
或onBackPressed()
中将异步任务标记为已取消,然后您可以在doInBackground()
中添加几个if块,如果任务取消,则立即返回
例如:
@Override
protected void doInBackground(Object... params){
// do some work
if(isCancelled()){
// end task right away
return null;
}
// if task is not cancelled yet,
// do some other work
}
但是,如果网络操作已经启动,则需要从HttpClient
中取消它。当单击返回按钮时,它将首先调用onBackPressed()
,因此在本部分中,取消异步任务
@Override
public void onBackPressed() {
if ( asyncFetch != null && asyncFetch.getStatus() == AsyncTask.Status.RUNNING ){
asyncFetch.cancel(true);
}
}
即使按下backkey,您也需要服务器的响应吗?如果实现正确,AsyncTasks不会阻止UI线程。发布您的完整代码。UI未被阻止。但是,在异步完成之前,活动不会被破坏。与您如何体验“back press freeze”相比,我体验到,在异步完成之前,活动不会被关闭。您确定您在没有super.onBackPressed()的情况下也尝试过同样的操作吗;一开始?我也试过,但我还是看到了问题。仅供参考,我在AsyncTast中所做的是HTTP通信。我正在通过HTTPClient连接到服务器。在http的过程中,back press只需等待finish()方法,直到异步任务完成。是的,我也尝试了相同的方法,但行为仍然相同。
@Override
protected void doInBackground(Object... params){
// do some work
if(isCancelled()){
// end task right away
return null;
}
// if task is not cancelled yet,
// do some other work
}
@Override
public void onBackPressed() {
if ( asyncFetch != null && asyncFetch.getStatus() == AsyncTask.Status.RUNNING ){
asyncFetch.cancel(true);
}
}