Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在AsyncTask运行时按下后退按钮_Android_Android Activity_Android Asynctask - Fatal编程技术网

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);
    } 
}