事件或处理程序?从线程调用方法

时间:2011-06-16 19:54:16

标签: java android events handler

考虑一个简单的Android应用程序:有两个TabActivities,后台有一个线程从服务器获取整数值。如果数字是偶数,则必须在第一个标签中显示,否则在第二个标签中显示。显然我会做一些更复杂的事情,但这是基本模式。我该怎么做呢?我现在已经摸不着头脑了一天,这是我遇到过的事情:

  1. 使用EventHandlers。两个TabActivities寄存器用于监听my_events,当线程收到一个值时,它会“抛出my_event”,然后调用这两个激活中的特定方法并传递值。

  2. 使用处理程序。

  3. 之前我没有使用过这两个概念,我想知道哪条路线可能更好/更正。此外,将欣赏沿所选路线的任何更多提示。此外,该线程是否应该从服务类运行?

2 个答案:

答案 0 :(得分:0)

创建线程时,只需将选项卡中的对象传递给它,然后在执行中,您可以轻松地将所需文本放入选项卡中。

答案 1 :(得分:0)

可能你想看看使用AysncTask。如果执行此操作,则需要将值插入onProgressUpdate()方法的相应选项卡中。由于传递给此方法的参数实际上可能无法充分表示传入数据,因此您只想将新数据放在可以从onProgressUpdate()方法访问的某个位置,可能在成员变量中。请记住,可能需要同步对此成员变量的访问,因为onProgressUpdate中的代码正在应用程序的主线程上运行,而doInBackground中的代码正在后台线程上运行,因此这些方法中的代码将同时运行。

AsyncTask透明地为您使用Handler,但如果您愿意,可以使用原始处理程序。您需要记住的基本事项是

  • 您可以/应该只从主应用程序线程
  • 更新UI
  • 处理程序中的代码始终在创建处理程序的线程上运行
  • 必须在具有Looper的线程上创建处理程序(主线程有一个Looper)
  • 在将Handler创建为匿名内部类或将其引用为Context时要小心,因为这会产生内存泄漏的可能性

可能由服务调用线程,但是如果线程只有在存在用于更新的UI时才需要存在,则可能没有什么意义。