【问题标题】:TimerTask executing on unequal time intervalsTimerTask 以不相等的时间间隔执行
【发布时间】:2014-01-16 14:39:27
【问题描述】:

我一直致力于在 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 次,更频繁。谁能告诉我为什么它会这样工作?我哪里做错了?

亲切的问候!

【问题讨论】:

    标签: android android-asynctask oncreate timertask


    【解决方案1】:

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

    【讨论】:

    • 好吧,但是如果我取消我的计时器,它就不会循环工作。我只是这样做了,出于好奇,它只执行了一次,正如我所料:(但感谢您的回复!
    • 你调用了多少次 loopAsyncTaskGetter() 方法?如果您只调用一次,那么问题是您的异步​​任务有时需要更长的时间,因此有时您会在前一个结束之前进行新的异步任务调用。因此,您会在短时间内看到多个更新。
    • 是的,我只调用一次,@onCreate() 方法。一次执行会持续一秒钟左右,所以我认为这是不可能的
    • 你能分享你的 onCreate 方法,以及你调用 loopAsyncTaskGetter 的部分吗?
    • 顺便说一句,在注意到位置发生变化后,我正在执行另一个 AsyncTask。会不会造成问题?我在某处读到有许多可以并行执行的 AsyncTasks。我的安卓版本是2.3.4。我仍然停留在这一点上。我希望它按我的意愿工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多