如何在应用程序关闭后在片段中停止AsyncTask



如何在关闭应用程序后停止Fragment类中的AsyncTask ?

<

MainActivity类/strong>

public class MainActivity extends FragmentActivity {
}

BaseFragment类被Fragment扩展

public class BaseFragment extends Fragment {
    public MainActivity mActivity;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        mActivity       =   (ChatActivity)this.getActivity();
    
    }
    
    public boolean onBackPressed(){
        return false;
    }
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }
    
}
<

片段类/strong>

public class Fragment1 extends BaseFragment{

private  Update  task;
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        
        toCallAsynchronous();
        return inflater.inflate(R.layout.activity_online_korisnici, container,
                false);
    }

     public void toCallAsynchronous() {
            final Handler handler = new Handler();
            Timer timer = new Timer();
            TimerTask doAsynchronousTask = new TimerTask() {       
                @Override
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {       
                            try {
                             task =new Update();
                             
                                // PerformBackgroundTask this class is the class that extends AsynchTask 
                                task.execute("");
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                            }
                        }
                    });
                }
            };
            timer.schedule(doAsynchronousTask, 0, 5000); //execute in every 50000 ms
        }


   private class Update extends AsyncTask<Object, Object, List<Object>>{
    @Override
        protected List<Object> doInBackground(Object... params) {
                     
                 }
@Override
        protected void onPostExecute(List<Object> result) {

}
   }

}

你可以使用Fragment的onPause()方法。当Fragment不再被恢复时调用它。这通常与Activity相关。

@Override
public void onPause() {
    super.onPause();
    task.cancel();
}

更新:如果您在TabHost下,并且Fragment在按下不同制表符时暂停,您可以这样做

在activity中存储fragment id或tag

实现一个方法来停止任务在你的片段

public void onActivityPause() {
    task.cancel();
}

在你的activity onPause()

@Override
protected void onPause() {
    super.onPause();
    FragmentManager fm = getFragmentManager();
    for (int id : ids) {
        Fragment f = fm.findFragmentById(id);
        try {
            Method stop = f.getClass().getMethod("onActivityPause");
            close.invoke(f);
        } catch (Exception e) {}
    }
}

但是我不会使用TabHost,它已经被弃用了。如果需要支持v4版本,可以考虑使用ActionBar或ActionBarSherlock。

task.cancel()将会这样做。确保在onBackground()onPostExecute()中包括对isCancelled()的频繁检查,以避免访问/更新不再存在的UI。

我有一个类似的问题——本质上,我在一个异步任务中得到了一个NPE,在用户销毁了活动之后。在研究了Stack Overflow的问题后,我采用了如下的解决方案:

布尔运行;

公共无效onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);
    running=true;
    ...
    }

public void onDestroy() {
    super.onDestroy();
    running=false;
    ...
}

然后,我在异步代码中定期检查"if running"。我对此进行了压力测试,现在我无法"中断"我的活动。这样做效果很好,而且比我在SO上看到的一些解决方案更简单,更不容易出错。

相关内容

  • 没有找到相关文章

最新更新