0

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

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

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

4

2 回答 2

1

我做了@Jeffrey 说的那样,但做了一些改变:

  • Application课堂上,onCreate()我得到当前和下一个事件并像@Jeffrey 说的那样创建处理程序,但在run()处理程序中Runnable我发送了一个广播。

  • 我在每个片段中注册一个BroadcastReceiver相同的。在接收器的方法中,我更新了.IntentFilterCurrentEventonReceive()TextView

于 2013-11-28T12:50:22.450 回答
1

我认为这样的事情应该有效。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;
    }
}
于 2013-10-23T11:34:42.983 回答