Java 在Android中使用多个处理程序时遇到问题
因此,我有一个带有处理程序的活动Java 在Android中使用多个处理程序时遇到问题,java,android,Java,Android,因此,我有一个带有处理程序的活动 private final Runnable m_Runnable = new Runnable() { public void run() { if(LiveAPI.getStatus() == 1){ matches = LiveAPI.getMatches(); listAdapter.notifyDataSetChanged(); }
private final Runnable m_Runnable = new Runnable()
{
public void run()
{
if(LiveAPI.getStatus() == 1){
matches = LiveAPI.getMatches();
listAdapter.notifyDataSetChanged();
}
LivePage.this.mHandler.postDelayed(m_Runnable, 5000);
}
};
在这里,我得到一些数据并用它更新我的列表。它起作用了
当我单击列表中的某一项时,将调用此函数
private void showLiveMatch(int position) {
Intent i = new Intent(this, LiveMatch.class);
i.putExtra("match", matches.get(position));
startActivity(i);
}
“我的新活动”出现,其中还包含另一个处理程序:
private final Runnable m_Runnable = new Runnable()
{
public void run()
{
if(LiveAPI.getStatus() == 1){
match = LiveAPI.getMatch(match.getId());
displayCommentaries();
}
LiveMatch.this.mHandler.postDelayed(m_Runnable, 5000);
}
};
有时候这是我想要的。
但在某些情况下,第二个活动似乎仍然从第一个处理程序调用LiveAPI.getMatches()
,而不是LiveAPI.getMatch(match.getId())代码>
每个函数都会显示一个控制台文本,这就是我如何确定调用哪个函数的方法
有人能解释一下原因吗?一旦你发布了m_Runnable
(从LivePage
或LiveMatch
),它会完成自己的工作,然后安排自己在5秒钟内运行。基本上,每次你点击一次,它就会创建一个无限循环。如果点击次数足够多,您将不断运行每一个操作的逻辑。(也就是说,除非您有一些其他代码周期性地调用mHandler.removeCallbacks(m_Runnable);
,您还没有向我们展示过这些代码。)在不了解更多关于您尝试执行的操作的情况下,很难推荐如何修复此问题,但您应该以某种方式避免创建此类无限循环
请注意,您在UI线程上创建的所有处理程序只需将Runnable
对象馈送到线程的(单个)MessageQueue
。因此,不存在从一个处理程序或另一个处理程序调用任何东西的情况。LivePage活动显示多场比赛的实时运动成绩,并且需要定期刷新数据。LiveMatch活动显示有关单个匹配的实时信息。调用LiveApi.getMatch(matchId)并更新信息。问题是在某些情况下,不会调用LiveApi.getMatch(),也不会调用我的信息updated@UnguruBulan-这听起来和你在文章中描述的问题不同。也许不是。正如我所说,除非停止循环,否则对LiveAPI.getMatches()
的调用将继续每5秒发生一次,即使在您启动了每5秒调用LiveAPI.getMatches()
的循环之后也是如此。这能解释你看到了什么吗?在不知道这两个方法的情况下,调用getMatches()
是否会干扰对getMatch()
的调用?感谢您的帮助,我使用了mHandler.removeCallbacks(m_Runnable)代码>当我切换到第二个活动时,以及this.mHandler.postDelayed(m_Runnable,5000)代码>当a恢复到第一个时。现在它;他在工作。谢谢again@UnguruBulan-很高兴听到。请注意,如果您在非UI线程上调用removeCallbacks
,而此时回调恰好正在运行(在UI线程上),那么它仍将重新调度自身。因此,如果存在这种可能性,您可能希望使用synchronized
块来排除这种可能性,和/或使用boolean
标志变量,回调可以使用该变量来指示何时不应重新安排自身。