HandlerThread如何处理消息?

时间:2012-05-06 08:22:37

标签: android handler surfaceview

我正在实现我自己的SurfaceView,其中包含一个Thread对象,其目的是将各种图形对象绘制到Canvas。在SurfaceView的构造函数中,我设置了要绘制的对象,Thread对象(当前)仅根据需要将它们定位到Canvas。

我现在需要在用户执行特定操作(即Thread对象正在运行)之后更改在SurfaceView的构造函数中创建的对象之一(该对象是Bitmap)。这意味着应用程序的GUI线程与执行我的Thread对象的线程之间的通信。我发现this页面详细介绍了HandlerThread类的使用,非常适合我需要实现的目标。但是,我需要确定此类如何工作以确保没有内存一致性错误。

以下是我自己类的伪代码,为了清楚起见,已经删除了很多:

public MyThread extends Thread {
    boolean _run = true;
    public void run(){

        // Create HandlerThread object
        // Create Looper object
        // Create Handler object
        while (_run){
            // DRAW the Bitmap in this loop
        }
    }

    public boolean handleMessage(Message message){
        /*
        ALTER the Bitmap here as required
        */
    }
}


public MyThread extends Thread {
    boolean _run = true;
    public void run(){

        // Create HandlerThread object
        // Create Looper object
        // Create Handler object
        while (_run){
            // DRAW the Bitmap in this loop
        }
    }

    public boolean handleMessage(Message message){
        /*
        ALTER the Bitmap here as required
        */
    }
}

据我了解,handleMessage()方法由执行run()方法的同一线程执行。但是因为handleMessage()改变了位图,而run()绘制了位图。在线程返回handleMessage()方法之前,我能确定run()是否完整?

1 个答案:

答案 0 :(得分:0)

不确定我是否理解这个问题?

你在这两种情况下扩展了一个常规的Thread类,它本身并没有做任何特别的事情。除非您指定runhandleMessage从不同的CALLING线程运行,否则进程以序列化方式执行。所以我的猜测是肯定的。这应该是一个相当直接的线程安全执行模式 - 如果你在同一个线程中调用handleMessagerun,那么就没有理由不应该同步它们。如果你从不同的线程调用这两个方法,(或者如果你非常担心并且在其他任何地方找不到答案),你可以在两个方法中使用synchronized(myLock)来锁定对象监视器。 :

public MyThread extends Thread {
    boolean _run = true;
    public void run(){
        synchronized(this) {
            while (_run){
            // DRAW the Bitmap in this loop
            }
        }
    }

    public boolean handleMessage(Message message){
        synchronized(this){...}
    }
}