get处理程序在LooperThread中返回null

ven*_*lee 5 multithreading android 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.
              }
         });
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

Har*_*ake 0

getHandler 方法返回 null,因为视图未附加:

public Handler getHandler() {
    if (mAttachInfo != null) {
        return mAttachInfo.mHandler;
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

mAttachInfo在 中设置dispatchAttachedToWindow并在 中清零dispatchDetachedFromWindow

而不是mapView.getHandler().post()你可以直接使用mapView.post()(这似乎使用getHandler().post()ViewRootImpl.getRunQueue().post()).