在我的应用程序中,我在顶部的每个活动中都有一个片段TextView
显示正在发生的当前事件。它看起来像这样:
--------------------
| Event name |
|------------------|
| |
| |
| |
| Activity |
| content |
| |
| |
| |
| |
| |
--------------------
我想在下一个事件开始时更新事件名称。
我正在使用单例模式,在我的应用程序中,我有每个活动开始时显示的currentEvent
字符串。我将事件保存在数据库中,每个事件都有开始时间。
更新事件名称的最佳方法是什么。如何根据下一个事件的开始时间安排将更新文本视图的事件?
答案 0 :(得分:1)
我认为这样的事情应该有效。 AsyncTask从数据库中获取当前事件名称和下一个事件开始时间。当找到它们时,将设置当前事件名称,并发布runnable,并在下一个事件开始时执行。此时,您再次获取该事件名称并进行设置,并发布新的延迟runnable。这样,当创建片段时,或者在用户打开片段时启动时,会设置当前事件名称。
请注意,您不希望使用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;
}
}
答案 1 :(得分:1)
我做了类似@Jeffrey的话,但有一些变化:
在Application
类中,onCreate()
我得到当前和下一个事件并创建处理程序,就像@Jeffrey所说,但是在处理程序的run()
中Runnable
我发了一个广播。
我在每个BroadcastReceiver
片段中注册了IntentFilter
CurrentEvent
个onReceive()
。在接收器的TextView
方法中,我更新{{1}}。