我想知道是否可以定期调用方法,而不使用Runnable和Timer类。简而言之,如何在不创建新线程的情况下调用方法? 谢谢。
答案 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);
}
}
答案 1 :(得分:0)
由于提到了AlarmManager,如果您的目标是API级别21及以上,则可以使用JobScheduler(AlarmManager应该用于较低级别的API):
这是一个用于安排各种类型的作业的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());