不使用Runnable和Timer类定期调用方法

时间:2013-12-05 15:21:51

标签: java android timer runnable

我想知道是否可以定期调用方法,而不使用Runnable和Timer类。简而言之,如何在不创建新线程的情况下调用方法? 谢谢。

2 个答案:

答案 0 :(得分:1)

  

我想知道是否可以定期调用方法,而不使用Runnable和Timer类

虽然您可以避免使用Timer,但您将需要某些来定期触发。

例如,您可以使用Runnable确实有效,然后在postDelayed()(或View)上调用Handler来安排自己再次在未来:

/***
  Copyright (c) 2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
 */

package com.commonsware.android.post;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class PostDelayedDemo extends Activity implements Runnable {
  private static final int PERIOD=5000;
  private View root=null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    root=findViewById(android.R.id.content);
  }

  @Override
  public void onResume() {
    super.onResume();

    run();
  }

  @Override
  public void onPause() {
    root.removeCallbacks(this);

    super.onPause();
  }

  @Override
  public void run() {
    Toast.makeText(PostDelayedDemo.this, "Who-hoo!", Toast.LENGTH_SHORT)
         .show();
    root.postDelayed(this, PERIOD);
  }
}

(来自this sample project

答案 1 :(得分:0)

由于提到了AlarmManager,如果您的目标是API级别21及以上,则可以使用JobScheduler(AlarmManager应该用于较低级别的API):

https://developer.android.com/reference/android/app/job/JobScheduler.html#schedule(android.app.job.JobInfo)

  

这是一个用于安排各种类型的作业的API   将在您的应用程序自己的流程中执行的框架。

     

该框架将在您收到您的时候非常聪明   回调,并尝试尽可能地批量和推迟它们。   通常,如果您没有在工作中指定截止日期,则可以运行该截止日期   在任何时候取决于JobScheduler的当前状态   内部队列,但它可能会延迟,直到下一个   设备连接电源的时间。

     

您不直接实例化此类;相反,检索它   通过Context.getSystemService(Context.JOB_SCHEDULER_SERVICE)。

JobService schedule方法需要JobInfo,可以配置定期延迟。

一个例子:

        ComponentName serviceComponent = new ComponentName(getContext(), YourService.class);

        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        builder.setOverrideDeadline(SERVICE_INTERVAL);
        //pass data to your service here.
        builder.setExtras(bundle);

        JobScheduler jobScheduler = getContext().getSystemService(JobScheduler.class);
        jobScheduler.schedule(builder.build());