gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:55:48 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com