小编Lan*_*nek的帖子

在调用之前,如何确保另一个Thread的Handler不为null?

我的程序在另一天尝试使用在另一个线程上创建的Handler向该线程发送消息时抛出了NullPointerException.尽管调用线程已经在另一个线程上调用了start,但是其他线程创建的Handler尚未创建,或者尚未对调用线程可见.这种情况很少发生.几乎每次测试都没有得到例外.

我想知道什么是最好的方法来避免这个问题,确保最小的复杂性和性能损失.该程序是一款游戏,性能非常敏感,特别是一旦运行.因此,我尝试避免在设置后使用同步,例如,并且宁愿在任何时候避免旋转变量.

背景:
在Android中,Handler类可用于"在不同于您自己的线程上执行操作".这里的文档:http:
//developer.android.com/intl/de/reference/android/os/Handler.html

必须在将使用它的线程上创建处理程序.因此,在线程的构造函数中创建它,由创建该线程的线程运行,不是一个选项.

当Handler用于UI线程以外的线程时,还必须使用Looper类:http:
//developer.android.com/intl/de/reference/android/os/Looper.html

该文档给出了为此目的使用这两个类的示例:

class LooperThread extends Thread {
    public Handler mHandler;

    public void run() {
        Looper.prepare();

        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // process incoming messages here
            }
        };

        Looper.loop();
    }
}
Run Code Online (Sandbox Code Playgroud)

我非常丑陋的解决方案目前看起来像这样:

public class LooperThread extends Thread {

    public volatile Handler mHandler;

    public final ArrayBlockingQueue<Object> setupComplete = new ArrayBlockingQueue<Object>(1);

    public void run() {
        Looper.prepare();

        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // …
Run Code Online (Sandbox Code Playgroud)

java null multithreading android

7
推荐指数
2
解决办法
3661
查看次数

标签 统计

android ×1

java ×1

multithreading ×1

null ×1