使用本地类变量处理句柄/线程

时间:2012-09-30 15:17:11

标签: java android multithreading

我在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时间共享),它的当前?

  1. 看起来我可以从处理程序访问类本地变量。但在线程中,eclipse让我在线程中编写本地类变量但是当它启动时,这个本地的地址不是线程本地的,并且在线程运行时我不会访问这个类本地。
  2. 谢谢!!!

3 个答案:

答案 0 :(得分:1)

对于第一个选项,禁止从UI线程以外的其他线程访问mapView或任何UI组件等视图,这就是Thread版本失败的原因。

对于延迟,使用Handler的第二个选项是更好的方法,并且不会失败,因为在UI线程上声明了Handler,这带来了一个关于Handlers的重要观点 - 处理程序在它们所在的线程上运行创建时,但该线程必须初始化为Looper线程,例如UI线程。

如果您可以为了清晰起见发布例外,也会很棒。

答案 1 :(得分:1)

我不明白第一个问题。请改写一下

HandlerThread之间的差异很大。 Android SDK只允许从运行它的线程更改UI / Activity线程。

换句话说,您无法从其他主题更改TextViewButton

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.....

   }
}