我有一个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
实现这个?请告诉我。
感谢任何帮助。
答案 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()的返回值(如果可能)(例如在循环内)。
简而言之,您可以在AsyncTask
或onPause()
中将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);
}
}