0

我正在用 android 编程,我想创建一个延迟。当我添加到我的活动类线程时,应用程序堆栈在将数据实现到变量后,但是当我使用处理程序(带有 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让我在线程中编写局部类变量,但是当它启动时,这个局部变量的地址不是线程局部变量,当线程运行时我无法访问这个类局部变量。

谢谢你!!!

4

3 回答 3

1

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

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

如果您可以发布例外以清楚起见,那也很棒。

于 2012-09-30T15:20:55.580 回答
1

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

Handlera和a的区别Thread很大。Android SDK 只允许从它运行的线程更改 UI / Activity 线程。

换句话说,您不能对不同的线程TextViewButton从不同的线程进行更改。

Android 提供了Handler该类,它允许您将消息从一个线程发送到另一个线程。

您应该做的是在您的主要活动中放置一个公共静态处理程序成员,并handleMessage在类中的某处实现该方法。

现在,当您在一个单独的线程中时,调用您的处理程序。

该类提供了几种方法Handler,例如sendEmptyMessage(int)sendMessage(Message)。使用最适合您的应用程序。

此外,在您提供的示例中,您正在使用该Handler.post()方法。在这种情况下,它只会Runnable在您的主线程上创建一个新线程,并且不会调用该handleMessage方法。

于 2012-09-30T16:02:51.710 回答
0

类中的私有字段只能在声明它们的类和该类的内部类中访问。您的处理程序是您的类的一个字段,处理程序代码本身是一个内部类。因为您的可运行文件是在新线程上创建的,所以它无法访问声明类的私有字段。你可以这样做:

class MyClass {

   private MapView mapView;
   private Boolean usePointerOverlay;

   private static Thread thread;

   void method(){

      thread = new Thread(new Runnable.....

   }
}
于 2012-09-30T15:26:16.563 回答