【发布时间】:2013-10-06 09:02:22
【问题描述】:
我有以下代码。
//This is global for the activity.
Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//update the UI
}
};
在我的 onResume() 中,我正在启动一个运行可运行对象的新线程。
protected void onResume()
{
super.onResume();
Thread t = new Thread(runnable);
t.start();
}
我的runnable如下:
Runnable runnable = new Runnable()
{
public void run()
{
// some networking stuff
// some db stuff
// whatever
handler.sendEmptyMessage(0);
handler.postDelayed(new Runnable()
{
public void run()
{
new Thread(runnable).start();
}
}, 30000);
}
}
我在 onPause() 里面有这个:
protected void onPause()
{
super.onPause();
handler.removeCallbacks(runnable);
}
最后我调用handler.sendEmptyMessage(0);,以便调用handleMessage(Message msg)并更改UI,我重复任务但启动一个新的runnable,它启动一个运行与此相同的runnable的新线程.
澄清问题:
我正在我的 onResume() 中启动一个新线程,这意味着可运行对象没有在 UI 线程上运行,但是,处理程序是在 UI 线程上创建的,并且自然附加到 UI 线程. UI 是如何完美改变的?
它应该用于 handler.removeCallbacks(runnable),但是,每当我最小化应用程序时,runnable 仍然每 30 秒运行一次。 (这可能是因为它在一个新线程上,与创建的处理程序无关)。我怎样才能让它停止?
【问题讨论】:
-
对于 2。我想说这是因为您可能没有删除同一个实例。看到您在每个
handler.postDelayed中创建一个新的Runnable实例,但您似乎只删除了一个共享实例。 -
啊哈,可能是。有什么诀窍?
-
不要创建新的可运行文件。使用
this可运行。并失去额外的线程。把那行写成handler.postDelayed(this, 30000); -
我认为您值得仔细阅读 Handler 和 Runnable 的文档。您的代码看起来就像您已经组装了一些您找到的代码示例,但没有完全理解它们的作用。除非在
handleMessage()中完成了大量工作,否则您将不需要新线程来执行您正在做的事情——但是,就目前而言,您无论如何都在 UI 线程上进行这项工作,因为 Handler 已绑定到实例化它的线程。 -
@323go 100%。我是一个新手,把这些东西从我在这里和那里读到的点点滴滴中。你是对的,主要的事情发生在线程内部。您能否将代码引导到我正在做的“我的想法”?关于在 UI 线程上做的工作,我想我不是,因为我没有得到任何 networkOnMainThread 异常。
标签: java android multithreading