安排TextView更新

时间:2013-10-23 09:24:23

标签: android scheduled-tasks android-event

在我的应用程序中,我在顶部的每个活动中都有一个片段TextView显示正在发生的当前事件。它看起来像这样:

--------------------
|    Event name    |
|------------------|
|                  |
|                  |
|                  |
|     Activity     |
|     content      |
|                  |
|                  |
|                  |
|                  |
|                  |
--------------------

我想在下一个事件开始时更新事件名称。 我正在使用单例模式,在我的应用程序中,我有每个活动开始时显示的currentEvent字符串。我将事件保存在数据库中,每个事件都有开始时间。 更新事件名称的最佳方法是什么。如何根据下一个事件的开始时间安排将更新文本视图的事件?

2 个答案:

答案 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 CurrentEventonReceive()。在接收器的TextView方法中,我更新{{1}}。