TimerTask以不相等的时间间隔执行

时间:2014-01-16 14:39:28

标签: android android-asynctask oncreate timertask

我一直在努力在Android上循环AsyncTask。我使用了一个用户建议的想法,我提出了这个想法:

public void loopAsyncTaskGetter(){
    final Handler handler = new Handler();
    final Timer timer = new Timer();
    TimerTask doAsynchronousTask = new TimerTask() {       

        @Override
        public void run() {         
                handler.post(new Runnable() {
                    public void run() {       
                        try {                                                               
                            new GetTasksAsync().execute(getIntent().getStringExtra(MainActivity.EXTRA_ID));                        
                        } catch (Exception e) {

                        }
                    }
                });
            }           
    };      
    timer.schedule(doAsynchronousTask, 500, 1000*30); 

}

我的AsyncTask扩展类看起来像这样:

class GetTasksAsync extends AsyncTask<String, Void, Void>{
    ProgressDialog dialog;
    @Override
    protected void onPreExecute(){
        //dialog stuff
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(String... data) {
                    //this method below returns JSON String from my PHP file
        String jsonData = Webserv.getTaskJson(data[0]);

        try {
            JSONArray jsonArray = new JSONArray(jsonData);

            for(int i=0; i<jsonArray.length(); i++){
                //some json parsing, doesn't matter                 
            }


        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return null;
    }
    @Override
    protected void onPostExecute(Void v){
        dialog.dismiss();           
        myAdapter.notifyDataSetChanged();   
        super.onPostExecute(v);
    }

我在Activity的onCreate()方法上调用了loopAsyncTaskGetter(),我希望在30秒内再完成一次。对我来说奇怪的是,它有时会工作一次30秒,有时它会完成f.e. 5秒内3次,更经常。谁能告诉我它为什么会这样?我在哪里弄错了?

亲切的问候!

1 个答案:

答案 0 :(得分:0)

完成后,您不会取消计时器。因此,您可能在后台运行多个计时器。将您的Timer作为参数传递给您的asynctask并在onPostExecute中取消它。