Android:AsyncTask运行时按下后退按钮

时间:2014-10-17 08:35:23

标签: android android-activity android-asynctask

我有一个ActivityA,它有一个按钮。点击button后,它会打开另一个ActivityB

onCreate()的{​​p> ActivityB方法,我正在启动AsyncTask,它连接到服务器并获取结果并将其显示在屏幕上。

以下是Activity 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.
    }
}

执行AsyncFetch时,按回按键时,ActivityB不会立即被销毁。但AsyncTask完成后会被破坏。

如何实施此操作以避免反压冻结?我在下面尝试过:

@Override
protected void onDestroy() {
    asyncFetch.cancel(true);
    super.onDestroy();
}

但仍等待AsyncTask取消或完成。

GMail app一样,当我打开一些东西时。在这个过程中,如果我按下后退按钮,它就会出现Activity

还有其他实现后台进程的方法吗?任何design pattern实现这个?请告诉我。

感谢任何帮助。

5 个答案:

答案 0 :(得分:4)

只需处理onBackPressed()方法:

@Override
public void onBackPressed()
{
    if (asyncFetch != null)
        asyncFetch.cancel(true);

    super.onBackPressed();
}

答案 1 :(得分:3)

来自Android开发者website

  

取消任务

     

可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)而不是onPostExecute(Object)。为确保尽快取消任务,应始终定期从doInBackground(Object [])检查isCancelled()的返回值(如果可能)(例如在循环内)。

简而言之,您可以在AsyncTaskonPause()中将onBackPressed()标记为已取消,然后您可以在{Activity中添加几个if块如果任务被取消,则立即返回。

例如:

doInBackground()

但是,如果网络操作已经开始,则需要从@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 } 取消。

答案 2 :(得分:2)

试试这个:

@Override
public void onBackPressed() {
    asyncFetch.cancel(true);
    // If you want to finish the activity you can use below code
    // finish(); 
}

答案 3 :(得分:1)

我们走了。试试这个。

@Override
public void onBackPressed() {
    if (asyncFetch.getStatus() == AsyncTask.Status.RUNNING) {
       asyncFetch.cancel(true);
    } 
    finish(); 
}

答案 4 :(得分:-1)

当您click后面button时,它会首先调用onBackPressed(),因此在此部分中,取消asynctask

@Override
public void onBackPressed() {
    if ( asyncFetch != null && asyncFetch.getStatus() == AsyncTask.Status.RUNNING ){
       asyncFetch.cancel(true);
    } 
}
相关问题