android - 在 LooperThread 中获取处理程序返回 null

标签 android multithreading handler

public class LooperThread extends Thread {

private Handler handler = null;

public Handler getHandler() {
    return handler;
}

@Override
public void run() {
    Looper.prepare();
    handler = new Handler();
    Looper.loop();
}

}

class Helper {
    private static LooperThread databaseThread = null;

static {
    databaseThread = new LooperThread();
    databaseThread.start();
}

public void postRunable(Runnable r) {
    databaseThread.getHandler().post(r);
    databaseThread.getHandler().sendMessage(new Message());
}
}

//ui thread.

 class UIActivity extends Activity {

     private Helper helper = new Helper();

     public void onCreate(Bundle savedInstanceState) {
         helper.postRunnable(new Runnable() {
              public void run() {
                  //work asyn,like query from db.
              }
         });
     }
 }

有时调用 databaseThread.getHandler().post(r); ,它返回 null,有时不是,为什么这样?像往常一样,handler 应该是初始的静态 block 。

最佳答案

您有时会得到一个空的 Handler,因为在静态初始化程序中调用 databaseThread.start(); 只能确保线程将在某个时间点启动 future 这意味着在新线程中创建的处理程序与在旧线程中调用 getHandler() 之间创建竞争条件。拥有一个带有后台循环程序的线程是 Android 中非常常见的模式,因此有一个类可以帮助我们解决这个问题。

首先摆脱您的 LooperThread 类并改用 SDK 的 HandlerThread

您的Helper 类现在应该看起来像

class Helper {
    private static final HandlerThread databaseThread;
    private static final Handler dbHandler;
    static {
        databaseThread = new HandlerThread("database thread");
        databaseThread.start();
        // If you have called HandelerThread#start()
        // HandlerThread#getLooper() will block until the looper is initialized and Looping
        dbHandler = new Handler(databaseThread.getLooper());
    }

    public void postRunable(Runnable r) {
        dbHandler.post(r);
    }
}

关于android - 在 LooperThread 中获取处理程序返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527837/

相关文章:

Android Google Analytics SDK 显示 "SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length"

android - Logcat 抑制 - 如何摆脱所有不需要的内部废话?

multithreading - 使用 C++ 在服务器上同时收听 UDP 和 TCP

java - 当我在四核机器上使用多线程时,为什么这段代码看不到任何显着的性能提升?

c - 信号终止处理程序和清理操作

Android:具有处理程序和可运行的 ListView 中的多个计时器。 2个问题

android - 动画 ListView 以增加大小

java - 对 Android Activity 中的方法进行单元测试

c# - 线程上下文和同步上下文

jquery - 如何调试为什么此点击处理程序永远不会触发?