解惑Android的post()方法究竟執行在哪個執行緒中

funnyok發表於2021-09-09

Android中我們常用的post()方法大致有兩種情況:

1.如果post方法是handler的,則Runnable執行在handler依附執行緒中,可能是主執行緒,也可能是其他執行緒

下面是Handler裡面的post方法

    /**
     * Causes the Runnable r to be added to the message queue.
     * The runnable will be run on the thread to which this handler is 
     * attached. 
     *  
     * @param r The Runnable that will be executed.
     * 
     * @return Returns true if the Runnable was successfully placed in to the 
     *         message queue.  Returns false on failure, usually because the
     *         looper processing the message queue is exiting.
     */
    public final boolean post(Runnable r){
       return  sendMessageDelayed(getPostMessage(r), 0);
    }
2.如果post方法是View的,則一定是執行在主執行緒中的,因為所有view都自帶一個handler,所有handler都有post方法,所以它的Runnable是執行在主執行緒中的

下面是View中的post方法

    /**
     * 

Causes the Runnable to be added to the message queue. * The runnable will be run on the user interface thread.

* * @param action The Runnable that will be executed. * * @return Returns true if the Runnable was successfully placed in to the * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. * * @see #postDelayed * @see #removeCallbacks */ public boolean post(Runnable action) { final AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { return attachInfo.mHandler.post(action); } // Assume that post will succeed later ViewRootImpl.getRunQueue().post(action); return true; }

例如:Imageview自帶一個handler,它有postDelayed方法,由於imageview是主執行緒上的,所以Runable是執行在主執行緒中的程式碼。

imageview.postDelayed(new Runnable() {  

        @Override  
        public void run() {  
            Intent mIntent = new Intent(MainActivity.this,  
                    SecondActivity.class);  
            startActivity(mIntent);  
            finish();  

        }  
    }, 2000); 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3137/viewspace-2799819/,如需轉載,請註明出處,否則將追究法律責任。

相關文章