AsyncTask即使在取消它之后也不会停止

时间:2014-12-14 09:53:51

标签: android listview android-fragments android-asynctask

我在片段中有一个AsyncTask,它使用Timer每秒执行一次。 AsyncTask将数据加载到ListView中,当用户单击ListView项时,它会切换到另一个片段。

计时器没有停止,所以它一直在执行,最后,当它试图将数据加载到ListView时给我一个错误。

我已经尝试过寻找答案,并在我的代码中实现了这些答案 -

class HttpGetAsyncTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onCancelled() {
        Log.d("PORTS Cancelled","cancelled");

    }

    @Override
    protected String doInBackground(String... q) {

        String v = null, c = null;
        for(int countervar=0;countervar<1;countervar++){
            if(load.isCancelled())  
                break;
            //All my code here
        }

        return c;

    }

    protected void onPostExecute(String result) {

        if(isCancelled()||!isAdded()){
            return;
        }
        else{
            SimpleAdapter adapter = new SimpleAdapter(getActivity(),
                ports, R.layout.playout, new String[] { "name",
            "code", "type" }, new int[] { R.id.portn, R.id.portc,
            R.id.portv });
            adapter.notifyDataSetChanged();
            lv.setAdapter(adapter);
        }
    }

}

@Override
    public void onPause() {
        super.onPause();
        timer.cancel(); //timer is the name of the Timer
        doAsynchronousTask.cancel(); //doAsynchronousTask is the TimerTask
        if(load!=null)          //load is the AsyncTask
            if(!load.isCancelled())
               load.cancel(true);
}

@Override
public void onDestroy() {
    super.onDestroy();
    timer.cancel();
    doAsynchronousTask.cancel();
    if(load!=null)
        if(!load.isCancelled())
            load.cancel(true);
}

计时器(在onCreateView中调用) -

handler = new Handler();
            doAsynchronousTask = new TimerTask() {       
                @Override
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {       
                            try {
                                load = new HttpGetAsyncTask();
                                load.execute();
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                            }
                        }
                    });
                }
            };
            timer.schedule(doAsynchronousTask, 0, 10000);

请让我知道我哪里出错了,我该怎么做才能解决这个问题。感谢。

2 个答案:

答案 0 :(得分:0)

如果在循环中添加一个布尔标志作为控制循环的条件呢?

然后您可以将其设置为false以停止onPause()

中的任务

答案 1 :(得分:0)

当计划doAsynchronousTask任务时,加载变量将替换为新的HttpGetAsyncTask。因此,多个AsyncTask可以同时运行,当您停止任务时,请调用:

load.cancel(true);

你只是取消了加载变量引用的AsyncTask,但是其他任务可以继续在backgroud中工作(没有任何句柄来阻止它们)。

解决方案可以是,在启动另一个之前停止AsyncTask。