我认为这样的事情应该有效。AsyncTask 从数据库中获取当前事件名称和下一个事件开始时间。当它找到这些时,设置当前事件名称,并发布一个可运行对象,并在下一个事件开始时执行。此时,您再次获得该事件名称并设置它,并发布一个新的延迟运行。这样,当前事件名称在创建片段时设置,或者在用户打开片段时设置。
请注意,您不想为此使用 AlarmManager。从文档中:
警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前没有运行。对于正常的计时操作(滴答声、超时等),使用Handler更容易且效率更高。
另请注意,我没有彻底测试此代码,因此当活动被杀死等时可能会出现一些问题。这个示例似乎有效,因为它每 10 秒显示一条 Toast 消息。
public class MyFragment extends Fragment implements Runnable {
TextView currentEventTextView;
Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
}
@Override
public void onStart() {
super.onStart();
new GetEventTask().execute();
}
@Override
public void onStop() {
handler.removeCallbacks(this);
super.onStop();
}
@Override
public void run() {
// next event is starting, so obtain it
new GetEventTask().execute();
}
private class GetEventTask extends AsyncTask<Void, Void, Event>{
@Override
protected Event doInBackground(Void... params) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// TODO get current name and next start time from db
Event event = new Event();
event.name = "Google I/O " + System.currentTimeMillis();
event.nextStartTime = System.currentTimeMillis() + 10000;
return event;
}
@Override
protected void onPostExecute(Event event) {
currentEventTextView.setText(event.name);
handler.postDelayed(MyFragment.this, event.nextStartTime - System.currentTimeMillis());
}
}
private class Event {
public String name;
public long nextStartTime;
}
}