我在android中编程,我想创建一个延迟。 当我添加到我的活动类线程时,应用程序堆栈实现数据到变量后, 但是当我使用handler(使用postDelay)时它工作正常。 1.为什么?
代码(mapView和userPointOverlay是类私有局部变量):
使用主题:
new Thread(new Runnable() //2.5sec delay between switches
{
@Override
public void run()
{
try
{
Thread.sleep(5000);
mapView.getOverlays().remove(userPointOverlay);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}).start();
使用处理程序:
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
mapView.getOverlays().remove(userPointOverlay);
}
}, 5000);
2.线程和处理程序之间的主要差异是什么?我明白了这个处理程序 在线程上运行我从它调用它(与主线程cpu时间共享),它的当前?
谢谢!!!
答案 0 :(得分:1)
对于第一个选项,禁止从UI线程以外的其他线程访问mapView或任何UI组件等视图,这就是Thread版本失败的原因。
对于延迟,使用Handler的第二个选项是更好的方法,并且不会失败,因为在UI线程上声明了Handler,这带来了一个关于Handlers的重要观点 - 处理程序在它们所在的线程上运行创建时,但该线程必须初始化为Looper线程,例如UI线程。
如果您可以为了清晰起见发布例外,也会很棒。
答案 1 :(得分:1)
我不明白第一个问题。请改写一下
Handler
和Thread
之间的差异很大。 Android SDK只允许从运行它的线程更改UI / Activity线程。
换句话说,您无法从其他主题更改TextView
或Button
。
Android提供Handler
类,允许您将消息从一个线程发送到另一个线程。
您应该做的是在主活动中放置一个公共静态处理程序成员,并在类中的某个位置实现handleMessage
方法。
现在当你在一个单独的线程中时,打电话给你的处理程序。
Handler
类提供了多种方法,例如sendEmptyMessage(int)
和sendMessage(Message)
。使用最适合您的应用程序。
此外,在您提供的示例中,您使用的是Handler.post()
方法。在这种情况下,它只会在主线程上创建一个新的Runnable
,并且不会调用handleMessage
方法。
答案 2 :(得分:0)
类中的私有字段只能在声明它们和该类的内部类的类中访问。您的处理程序是您的类的一个字段,处理程序代码本身是一个内部类。因为您的runnable是在新线程上创建的,所以它无法访问声明类私有字段。你可以这样做:
class MyClass {
private MapView mapView;
private Boolean usePointerOverlay;
private static Thread thread;
void method(){
thread = new Thread(new Runnable.....
}
}