我觉得这样的事情应该可以工作。 AsyncTask从数据库获取当前事件名称和下一个事件开始时间。找到它们时,将设置当前事件名称,并发布可运行内容,并在下一个事件开始时执行。此时您再次获取该事件名称并进行设置,并发布一个新的延迟可运行。这样,当前事件名称在创建片段时设置,或者当用户将片段打开时设置。
请注意,您不希望为此使用AlarmManager。从documentation:
报警管理器是用于在您希望您的 应用程序代码运行在特定的时间的情况下,即使你的应用程序是 目前没有运行。对于正常的定时操作(滴答,超时, 等),使用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;
}
}
我喜欢这个想法。它听起来不错:)我的第一个想法是使用'AlarmManager'并在下一个事件开始时间安排警报。这个闹钟会发送广播,我会在我的片段中播放接收器。在'onReceive()'方法的广播接收器中,我将更新文本视图以显示新的事件名称。如果应用程序没有运行,则不会收到广播,也不会发生任何事情。你能告诉我你对这个想法有什么看法?谢谢 – nikmin
不,你不应该使用AlarmManager。这些文档特别解释了Handler方法更有效率,因为我也写了我的原始答案。 –
好的,非常感谢,明天我会试试看看它是如何工作的 – nikmin