解惑Android的post()方法究竟運行在哪一個線程中

Android中咱們經常使用的post()方法大體有兩種狀況:java

1.若是post方法是handler的,則Runnable執行在handler依附線程中,多是主線程,也多是其餘線程

下面是Handler裏面的post方法markdown

/**
     * 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方法app

/** * <p>Causes the Runnable to be added to the message queue. * The runnable will be run on the user interface thread.</p> * * @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是運行在主線程中的代碼。ide

imageview.postDelayed(new Runnable() {  

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

        }  
    }, 2000);
相關文章
相關標籤/搜索