2013-10-23 56 views
0

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

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

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

回答

1

我没有它像@Jeffrey说,但也有一些变化:

  • Application类,在onCreate()我得到的当前和下一个事件,并创建处理程序就像@Jeffrey说,但在处理程序的 Runnable我发送广播。

  • 我在CurrentEvent的每个片段中注册了BroadcastReceiverIntentFilter。并且在接收机的onReceive()方法中,我更新TextView

1

我觉得这样的事情应该可以工作。 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; 
    } 
} 
+0

我喜欢这个想法。它听起来不错:)我的第一个想法是使用'AlarmManager'并在下一个事件开始时间安排警报。这个闹钟会发送广播,我会在我的片段中播放接收器。在'onReceive()'方法的广播接收器中,我将更新文本视图以显示新的事件名称。如果应用程序没有运行,则不会收到广播,也不会发生任何事情。你能告诉我你对这个想法有什么看法?谢谢 – nikmin

+0

不,你不应该使用AlarmManager。这些文档特别解释了Handler方法更有效率,因为我也写了我的原始答案。 –

+0

好的,非常感谢,明天我会试试看看它是如何工作的 – nikmin