Android 事件分发机制

前言

我们都知道给一个控件注册点击事件是只需要setOnClickListener,传入一个实现了onClick方法的匿名内部类,注册触摸事件只需要setOnTouchListener,传入一个实现了onTouch方法的匿名内部类,但是你会发现onTouch不同于onClick的一点是它是具有返回值的,这个返回值有什么用呢,onTouch和onClick方法谁先被调用呢?他们都是在那个函数中被调用的呢?下面我们就来看一看!

基础

//
button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                System.out.println("onTouch");
                return false;
            }
        });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("onClick");
            }
        });
//
 09:37:30.432 6758-6758/com.example.administrator.mydemo I/System.out: onTouch
 09:37:30.538 6758-6758/com.example.administrator.mydemo I/System.out: onTouch
 09:37:30.541 6758-6758/com.example.administrator.mydemo I/System.out: onTouch
 09:37:30.548 6758-6758/com.example.administrator.mydemo I/System.out: onClick

 

我们可以看到onTouch是先于onClick被调

用的,那么我们在手都抛一个异常来看一下他的函数调用栈

//
at com.example.administrator.mydemo.MainActivity$1.onTouch(MainActivity.java:29)
at android.view.View.dispatchTouchEvent(View.java:11730)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2963)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2963)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2963)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2963)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2963)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2963)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:448)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1828)
at android.app.Activity.dispatchTouchEvent(Activity.java:3360)
//

这个只是截取了一部分,我们只看到追溯到Activity即可,所以对于onTouch方法,它是这样被调用的 … … -> Activity.dispatchTouchEvent -> PhoneWindow.superDispatchTouchEvent -> DecorView.superDisparchTouchEvent -> ViewGroup.dispatchTouchEvent – > ViewGroup.dispatchTransformedTouchEvent -> View.dispatchTouchEvent 那我们就可以按照这个顺序来看一看正常情况下的事件流的流向和相关函数代码

同时我们也可以看出对Touch事件它是由Activty->ViewGroup->View三层结构由外到内,Android5.0后代码变得更复杂了,但是原理没有变,我们就看一看便于理解的老代码

在开始之前为了第一次接触的人便于理解,我就简单的把情况设置为这个Activity中只有一个Layout,Layout中只有一个Button,所以只有一个Activty,一个ViewGroup,一个View,但是你要明白的是在安卓里ViewGroup也是一个View,View拥有dispatch方法,而ViewGroup作为它的子类重写了该方法,在后面提到时你要区分它调用的是作为Layout(ViewGroup)的dispatch方法,还是Layout作为一个View的dispatch方法!!!另外你还要区分ViewGroup是View的子类,Button是ViewGroup的子view

Acitivty

//
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        onUserInteraction();
    }
    if (getWindow().superDispatchTouchEvent(ev)) {
        return true;
    }
    return onTouchEvent(ev);
}
//

onUserInteraction是一个空方法,用户可以去overwrite,来实现自己的需求,这里我们就直接跳过,按照上面的函数栈默认情况下是没有调用onTouchEvent的,那一定是上面的if成立,我们就来看一看if的判断条件

getWindow()Window是抽象

类,其唯一实现为PhoneWindow,所以在上面的函数栈出现了PhoneWindow.superDispatchTouchEvent

PhoeWindow

 //
 public boolean superDispatchTouchEvent(MotionEvent event) {

        return mDecor.superDispatchTouchEvent(event);
 }
//

DecorView是PW类的一个内部类

DecorView

//
public boolean superDispatchTouchEvent(MotionEvent event) {

        return super.dispatchTouchEvent(event);
}
//

DecorView是PW类的一个内部类

,DecorView继承于FrameLayout,FrameLayout并没有重写该方法,所以调用了它的父类ViewGroup的dispatch方法

下面我们就正式进入了ViewGroup的dispatch方法

ViewGroup

每次调用dispatch方法时都会进行一个判断

//
if (disallowIntercept || !onInterceptTouchEvent(ev)) { 
不拦截...  ...
} 
拦截...
//

disallowIntercept  是否禁用事件拦截 默认为false

onInterceptTouchEvent(ev)

//
 public boolean onInterceptTouchEvent(MotionEvent ev) {  

    return false;

  }
//

默认情况下return false,也就是不拦截,可以通过手动overwrite实现拦截;综上在默认条件下会已进入if代码块,也就是将事件继续向下传递,我们来看一下不拦截的代码

//
for (int i = count - 1; i >= 0; i--) {  
    final View child = children[i];  
    if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE  || child.getAnimation() != null) {  
        child.getHitRect(frame);  
       //遍历所有子view,找到当前正在被点击的子view,进入if内部
        if (frame.contains(scrolledXInt, scrolledYInt)) {  
            final float xc = scrolledXFloat - child.mLeft;  
            final float yc = scrolledYFloat - child.mTop;  
            ev.setLocation(xc, yc);  
            child.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;  

            if (child.dispatchTouchEvent(ev))  { //调用了子view的dispatch方法

                 mMotionTarget = child;  
                 return true; //是否返回true取决于子view的dispatch返回值
                       
            }  
        }  
    }  
}
... ...  
//

子view就是Button,而Button继承于TextView,但他们都没有overwrite dispatch方法,所以直接就追溯到了View.dispatchTouchEvent方法在

PS:在ViewGroup内还有一个dispatchTransformedTouchEvent,它的作用是将坐标转换为子view的坐标

View

//
public boolean dispatchTouchEvent(MotionEvent event) {  

    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
          mOnTouchListener.onTouch(this, event)) {  
          return true;  
    } 
    return onTouchEvent(event);  
}
//

令人激动!我们终于找到了注册的onTouch方法,Touch事件是经过层层传递,最后在Button的dispatch(继承于View)的方法内被处理了,我们在来看一下它这个if的判断条件

mOnTouchListener 只要你setListner就一定为true

(mViewFlags & ENABLED_MASK) == ENABLED   该控件可点击则为 true

mOnTouchListener.onTouch(this, event)  这个就是overwrite onTouch方法时的返回值,默认是false,所以该view的返回值就是onTouchEvent的返回值,也可以说onTouchEvent是否能执行,取决于onTouch的返回值

既然默认if条件不成立,就一定会执行这个button的onTouchEvent(),那么一直为从露面的onClick方法一定就在这里

View.onTouchEvent

//
public boolean onTouchEvent(MotionEvent event) {  
    ...  ...
    if (((viewFlags & CLICKABLE) == CLICKABLE ||  
            (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {  

           switch (event.getAction()) { 
           //抬起手指,完成点击
                 case MotionEvent.ACTION_UP:  
                        boolean prepressed = (mPrivateFlags & PREPRESSED) != 0;  
                            ... ...
                        performClick();  
                        break;  
                   ... ...
           }  
           // 若该控件可点击,就一定返回true
           return true;  
     }  
 // 若该控件不可点击,就一定返回false
 return false;  
}
    
//

该方法返回值取决于if判断,如果可点击进入if执行相关操作,返回true,否则跳过if返回发生了,对于我设定的情况button肯定是可点击的,进入if,对action进行switch判断,如果为up也就是抬起手指,调用了pe

rformClick方法

performClick

//
public boolean performClick() {  
        if (mOnClickListener != null) {  
            playSoundEffect(SoundEffectConstants.CLICK);  
            mOnClickListener.onClick(this);  
            return true;  
        }  
        return false;  
    } 
//

激动!我们终于发现注册的onClick方法了!是在Button的onTouchEvent中的performClick中被调用的;另外只要set了Listener返回值就为true,但是在onTouchEvent中没有对其做判断,它的返回值并不起什么作用

返回

现在我们已经找到最内层函数,现在要开始一层层向上返回,

当执行完performClick后

,Button的onTouchEvent方法返回了true

Button的dispatch方法return onTouchEvent 也返回了true

ViewGroup中的 if (child.dispatchTouchEvent(ev))条件成立,ViewGroup.dispatch也返回了true

DecorView的dispatch 返回super.dispatchTouchEvent(event) 即ViewGroup.dispatch 也返回true

PhoneWindow的dispatch 返回mDeco

r.superDispatchTouchEvent(event) 也返回true

Activity的dispatch if条件成立,也返回true,到此事件分发结束

我们可以把DecorView和PhoneWindow忽略掉,实际上他们并没有作什么有用的操作,所以实际事件流只经过了三层Activity->ViewGroup->View,最后层层返回

复杂

(一)

我们从最后开始向前找第一个出现分支的地方,在View的onTouchEvent方法

//
//
public boolean onTouchEvent(MotionEvent event) {  
    ...  ...
    if (((viewFlags & CLICKABLE) == CLICKABLE ||  
            (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {  
    ...  ...
           // 若该控件可点击,就一定返回true
           return true;  
     }  
 // 若该控件不可点击,就一定返回false
 return false;  
}
//

假如这个Button你将Clickable设置为false,该方法将返回false,performClick方法将不会被调用,同时对于View.dispatch方法也将返回fals

e

//
public boolean dispatchTouchEvent(MotionEvent event) {  

    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
          mOnTouchListener.onTouch(this, event)) {  
          return true;  
    } 
    return onTouchEvent(event);  
}
//

在ViewGroup内if条件也不再成立

//
 if (child.dispatchTouchEvent(ev))  { //调用了子view的dispatch方法
       mMotionTarget = child;  
       return true; //是否返回true取决于子view的dispatch返回值                   
 }  
//

我们来看一下ViewGroup内,该if不成立它所执行

的代码

//
boolean isUpOrCancel = (action == MotionEvent.ACTION_UP) ||  
                    (action == MotionEvent.ACTION_CANCEL);  
            if (isUpOrCancel) {  
                mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;  
            }  
            final View target = mMotionTarget;  

        if (target == null) {  
         ... ...
            return super.dispatchTouchEvent(ev);
        } 
//

如果target为null也就是点击空白或者没有子view处理

事件,ViewGroup将调用super.dispatchTouchEvent,注意ViewGroup的父类是View,也就是说现在这个Layout将不再作为一个ViewGroup,而是作为一个View,它自身也可以被Click被Touch

而对于一个View的dispatch方法我们在上面已经讲过了,他会先执行onTouch,如果返回false即该事件没有被消费掉,就会执行onTouchEvent,进一步执行onClick,情况就类似于上面我们所分析的那样

(二)

另一个出现分支的地方,ViewGroup的onInterceptTouchEvent,假如我们让他成立,即拦截事件,不会进入if,但是它实际上也是执行这段代码,也就是说,如果没有子view处理事件,或者在dispatch时就被拦截,他都会执行这段代码,以一个View而不是ViewGroup的身份来调用dispatch

//
//
boolean isUpOrCancel = (action == MotionEvent.ACTION_UP) ||  
                    (action == MotionEvent.ACTION_CANCEL);  
            if (isUpOrCancel) {  
                mGroupFlags &= ~FLA
G_DISALLOW_INTERCEPT;  
            }  
            final View target = mMotionTarget;  

        if (target == null) {  
         ... ...
            return super.dispatchTouchEvent(ev);
} 
//

 

我们来看一下假如没有注册任何listener,没有任何拦截它会是什么样的一个流程

我们可以把虚线部分忽略掉,实际函数的执行顺序是一个U型,先下后上,任何一个方法返回true,事件都会被消费,任何一个方法返回false,最终都会执行到上一层view的onTouchEvent方法

这篇文章先讲到这里,有空再更新

 

Android 事件分发机制》有105个想法

  1. oprolevorter说:

    Wonderful blog! I found it while searching on Yahoo News. Do you have any tips on how to get listed in Yahoo News? I’ve been trying for a while but I never seem to get there! Cheers

    • JerryWrata说:

      Знаете ли вы?
      Среди клиентов древнеримского афериста был император Марк Аврелий.
      Кустурица пропустил получение «Золотой ветви» в Каннах, так как любит друзей больше, чем церемонии награждения.
      Фиктивно отменить рабство в Камбодже её короля заставили французские колонизаторы.
      Сын политика-пьяницы помог принять сухой закон в своей провинции.
      «С любимыми не расставайтесь…» автор написал после того, как чуть не погиб в железнодорожной катастрофе.

      [url=http://arbeca.net/]arbeca[/url]

  2. MatBuct说:

    Servizio Iene Cialis Purchase Doxycycline [url=http://cialibuy.com]cialis 20mg price at walmart[/url] Buy Cefixime Online Indian Pharmacy Alli Ordering In Canada Free Shipping Clobetasol Internet

  3. Jaigree说:

    By their very nature, quality writing demands that students demonstrate proof of research, as well as a careful integration of the outcomes of such research with knowledge acquired in the classroom.
    custom papers Tell them what you told us – that their barrage of negative feedback is hampering your motivation and productivity, and that you would have an easier time incorporating their feedback if they could find a more positive way to phrase it.

  4. Nitomia说:

    Essay on national language hindi wikipedia in hindi pt3 informal letter model essay graphic organizer 3 paragraph essay pdf essay on life skills in english.
    write my papers Scholarship service creating a thesis and an outline for a critical analysis essay cow ka essay hindi mai essay about how to stop bullying in school, history essay writing service.

  5. swisivy说:

    In truth, those customers who buy college papers online almost always provide positive feedback about the quality of our work and the manner in which we deliver our services. custom paper Due to these reasons, our clients are coming back to our specialists every right time they experience academic problems which require solutions within a few hours.

  6. excano说:

    If you think that studying chemistry, biology, computer engineering, or other complicated subjects makes it difficult for us to do your assignment, you are mistaken. write my paper As part of its marketing campaign, an essay writing service is likely to maintain its own reviewing website, where it will position itself on the top position and trash all other writing services.

  7. Trorne说:

    We take care of all types of papers and homework assignments to give you the boost you need to keep up with school alongside work, activities, social lives, and personal challenges. paper writer There are also instances that you might not be satisfied with the paper that has been submitted to you because it did not follow your specified instructions or guidelines.

  8. Jaigree说:

    Report for 2014 revealed that black countertops, open shelves or glass-front cabinets, and darker paint tones will be popular with homeowners next year. thefereviewcourse.com During the performances, the band plays with innovative lighting effects on stage as well as on the protagonists themselves.

  9. Swatly说:

    The low-level task of foreground-background segregation is an important foundation for many high-level computer vision tasks and has been intensively researched in the past. tgu tommyguns In search of a vivid blue how a diagnosis of schizoaffective disorder doesnt mean the end of a functional life.

  10. Acatty说:

    Mal, dass es zwischen uns deswegen krachte, wurde ich sauer, dass er mich nicht so akzeptiert wie ich bin. lapnl How to set goals change your life by learning the process to set goals develop them and stay focused so you can achieve them.

  11. MubOpege说:

    Indian astrology is the fact that it has considerable difference in its principles and logics from the western astrology. hearthealthheroes For a whole month in the late summer, every day brought new attractions at various sites in the royal capital and its surroundings.

  12. abnoda说:

    Du kannst dir nicht mehr sagen, dass du nicht erleuchtet bist, und du kannst dir das auch von niemandem mehr einreden lassen. frontechnigeria Confusion reigns in their hearts because they know the signs of the times are perilous indicators of the end.

  13. pyslemy说:

    This was a lot of time for a small community living in difficult conditions to invest in a sculpture that was useless for their physical survival. thunk zine Active targeting of mesoporous silica drug carriers enhances g-secretase inhibitor efficiency in an in vivo model of breast cancer.

  14. smore traiolit说:

    I think this is among the most significant info for me. And i am glad reading your article. But wanna remark on some general things, The site style is great, the articles is really great : D. Good job, cheers

  15. cbd oil说:

    This is really interesting, You are a very skilled blogger. I have joined your feed and look ahead to in search of extra of your magnificent post. Also, I’ve shared your web site in my social networks|

  16. aredaby说:

    Your email address will not be published – is imodium safe to take when pregnant. Required fields are marked (*). impossible buy cialis Ook britse operations die sexual out-of-pocket order information, coupon kunnen voortaan de transition internetapotheken herkennen dankzij de problem control number work base result product quinine.

  17. agen bandarQ说:

    My developer is trying to convince me to move
    to .net from PHP. I have always disliked the idea because of the expenses.
    But he’s tryiong none the less. I’ve been using Movable-type on a variety of websites for about a year and am worried about switching to another platform.
    I have heard good things about blogengine.net. Is there a way I
    can transfer all my wordpress posts into it? Any
    help would be greatly appreciated!

  18. TedJaild说:

    [url=https://baclofen24.com/]buy baclofen from india[/url] [url=https://ventolinh.com/]buy ventolin[/url] [url=https://avanatop.com/]buy avana[/url] [url=https://xenical24.com/]xenical diet pill[/url] [url=https://kamagratb.com/]kamagra 100mg pills[/url]

  19. UgoJaild说:

    [url=http://tadalafilsale.com/]tadalafil 40 mg daily[/url] [url=http://dapoxetinetabs.com/]dapoxetine usa buy[/url] [url=http://amitriptyline365.com/]amitriptyline 10mg[/url] [url=http://wellbutrinbupropion.com/]wellbutrin brand name india[/url] [url=http://vermox.us.org/]buy vermox[/url] [url=http://xenical24.com/]xenical 120mg capsules australia[/url]

  20. ZakJaild说:

    [url=https://vermox.us.org/]vermox 500 tablet[/url] [url=https://hydroxychloroquine.us.org/]hydroxychloroquine buy uk[/url] [url=https://furosemidelasix.com/]furosemide 50 mg price[/url] [url=https://levitra36.com/]levitra generic[/url] [url=https://sildenafil36.com/]sildenafil uk over the counter[/url] [url=https://ciprofloxacin24.com/]ciprofloxacin 250mg[/url] [url=https://singulair.us.org/]singulair tabs 10mg[/url] [url=https://baclofen24.com/]cost of baclofen[/url]

  21. MaryJaild说:

    [url=https://kamagratb.com/]kamagra 50 sale in usa[/url] [url=https://dapoxetinetabs.com/]dapoxetine over the counter[/url] [url=https://hydroxychloroquine.us.org/]hydroxychloroquine sulfate[/url] [url=https://singulair.us.org/]singulair medication[/url] [url=https://doxycycline36.com/]doxycycline 100 mg[/url] [url=https://amoxicillinz.com/]amoxicillin 500[/url] [url=https://silagra24.com/]silagra 50 mg price[/url] [url=https://amitriptyline365.com/]amitriptyline hcl[/url] [url=https://furosemidelasix.com/]where to buy furosemide[/url] [url=https://valtrex.us.org/]valtrex without prescription us[/url]

  22. TedJaild说:

    [url=https://ciprofloxacin24.com/]ciprofloxacin 500mg antibiotics[/url] [url=https://cymbaltaduloxetine.com/]buy cymbalta[/url] [url=https://avanatop.com/]buy avana[/url] [url=https://wellbutrinbupropion.com/]best generic wellbutrin 2018[/url] [url=https://buspar.us.com/]buspirone[/url] [url=https://doxycycline36.com/]buy doxycycline[/url] [url=https://isotretinoinacutane.com/]buy accutane[/url]

  23. PaulJaild说:

    [url=https://priligytab.com/]priligy tablets over the counter[/url] [url=https://clonidinenorx.com/]buy clonidine[/url] [url=https://chloroquine.us.com/]chloroquine sulphate[/url] [url=https://xenical24.com/]buy xenical[/url] [url=https://buspar.us.com/]buy buspar online uk[/url]

  24. MarkJaild说:

    [url=https://amitriptyline365.com/]can you buy amitriptyline over the counter[/url] [url=https://levitra36.com/]how to purchase levitra online[/url] [url=https://celebrexcelecoxib.com/]celebrex rx[/url] [url=https://erythromycinz.com/]erythromycin otc[/url] [url=https://cymbaltaduloxetine.com/]buy duloxetine[/url] [url=https://atorvastatin.us.com/]lipitor buy[/url] [url=https://tadalafilsale.com/]tadalafil 5 mg tablet coupon[/url] [url=https://isotretinoinacutane.com/]accutane generic canada[/url]

  25. JasonJaild说:

    [url=http://xenical24.com/]xenical orlistat[/url] [url=http://valtrex.us.org/]valtrex pills[/url] [url=http://silagra24.com/]silagra generic[/url] [url=http://furosemidelasix.com/]how much is furosemide 40 mg[/url] [url=http://wellbutrinbupropion.com/]wellbutrin generic online[/url] [url=http://erythromycinz.com/]erythromycin price[/url] [url=http://levitra36.com/]levitra over the counter usa[/url] [url=http://sildenafil36.com/]sildenafil generic[/url] [url=http://baclofen24.com/]buy baclofen[/url] [url=http://ciprofloxacin24.com/]ciprofloxacin 500[/url]

  26. AshJaild说:

    [url=http://chloroquine.us.com/]cloroquina[/url] [url=http://amitriptyline365.com/]amitriptyline 10mg[/url] [url=http://hydroxychloroquine.us.org/]plaquenil tab 200mg[/url] [url=http://buspar.us.com/]buspar drug[/url] [url=http://isotretinoinacutane.com/]accutane medication cost[/url] [url=http://xenical24.com/]xenical tablets[/url] [url=http://sildenafil36.com/]sildenafil 20 mg[/url] [url=http://ventolinh.com/]ventolin price uk[/url]

  27. YonJaild说:

    [url=https://valtrex.us.org/]valtrex over counter[/url] [url=https://isotretinoinacutane.com/]buy accutane online[/url] [url=https://celebrexcelecoxib.com/]buy celebrex[/url] [url=https://chloroquine.us.com/]chloroquine for malaria[/url] [url=https://singulair.us.org/]over the counter singulair 10mg tablets[/url] [url=https://atorvastatin.us.com/]lipitor canada price[/url] [url=https://tadalafilsale.com/]tadalafil generic 10mg[/url]

  28. ZakJaild说:

    [url=https://amoxicillinz.com/]amoxicillin 500mg nz[/url] [url=https://chloroquine.us.com/]chloroquine otc canada[/url] [url=https://clonidinenorx.com/]buy clonidine[/url] [url=https://isotretinoinacutane.com/]120mg accutane[/url] [url=https://kamagratb.com/]buy kamagra[/url]

  29. YonJaild说:

    [url=https://finpecia911.com/]finpecia online india[/url] [url=https://levitra36.com/]levitra 20[/url] [url=https://ciprofloxacin24.com/]ciprofloxacin 750 mg price[/url] [url=https://clonidinenorx.com/]clonidine medication[/url] [url=https://tadalafilsale.com/]generic cialis tadalafil[/url] [url=https://amitriptyline365.com/]amitriptyline 25mg[/url] [url=https://priligytab.com/]priligy generic[/url] [url=https://avanatop.com/]avana top[/url]

  30. JudyJaild说:

    [url=https://singulair.us.org/]singulair pills over the counter[/url] [url=https://avanatop.com/]buy avana[/url] [url=https://erythromycinz.com/]erythromycin otc[/url] [url=https://furosemidelasix.com/]buy furosemide[/url] [url=https://kamagratb.com/]where to buy kamagra[/url] [url=https://wellbutrinbupropion.com/]wellbutrin online[/url] [url=https://sildenafil36.com/]where to buy sildenafil[/url] [url=https://clonidinenorx.com/]clonidine tablet[/url] [url=https://priligytab.com/]priligy usa[/url] [url=https://xenical24.com/]xenical pills[/url]

  31. ZakJaild说:

    [url=https://dapoxetinetabs.com/]buy dapoxetine[/url] [url=https://wellbutrinbupropion.com/]wellbutrin generic[/url] [url=https://clonidinenorx.com/]clonidine brand name in canada[/url] [url=https://amoxicillinz.com/]buy amoxicillin[/url] [url=https://atorvastatin.us.com/]atorvastatin lipitor[/url] [url=https://ventolinh.com/]ventolin hfa[/url] [url=https://xenical24.com/]xenical orlistat[/url] [url=https://buspar.us.com/]buy buspar[/url]

  32. AlanJaild说:

    [url=https://dapoxetinetabs.com/]dapoxetine tablets[/url] [url=https://sildenafil36.com/]sildenafil generic[/url] [url=https://ventolinh.com/]buy ventolin[/url] [url=https://kamagratb.com/]kamagra 50g[/url] [url=https://amitriptyline365.com/]amitriptyline tablets[/url] [url=https://wellbutrinbupropion.com/]wellbutrin online[/url] [url=https://silagra24.com/]buy silagra india[/url] [url=https://doxycycline36.com/]vibramycin doxycycline[/url] [url=https://clonidinenorx.com/]clonidine 0.1 mg oral tablets online orde[/url] [url=https://xenical24.com/]buy xenical[/url] [url=https://tadalafilsale.com/]buy tadalafil[/url] [url=https://priligytab.com/]order priligy online[/url] [url=https://valtrex.us.org/]generic valtrex[/url] [url=https://buspar.us.com/]buspar 5[/url] [url=https://hydroxychloroquine.us.org/]buy hydroxychloroquine[/url] [url=https://atorvastatin.us.com/]buy lipitor[/url] [url=https://avanatop.com/]super avana[/url] [url=https://singulair.us.org/]singulair generic coupon[/url] [url=https://finpecia911.com/]finpecia without prescription[/url] [url=https://furosemidelasix.com/]furosemide medication[/url]

  33. JudyJaild说:

    [url=https://singulair.us.org/]buy singulair 10mg[/url] [url=https://valtrex.us.org/]valtrex buy[/url] [url=https://doxycycline36.com/]how to buy doxycycline without a prescription[/url] [url=https://baclofen24.com/]daily baclofen[/url] [url=https://cymbaltaduloxetine.com/]cymbalta 90 mg[/url] [url=https://furosemidelasix.com/]where can i buy otc furosemide[/url] [url=https://tadalafilsale.com/]buy tadalafil[/url] [url=https://amoxicillinz.com/]amoxicillin 500[/url] [url=https://buspar.us.com/]buy buspar online australia[/url] [url=https://chloroquine.us.com/]buy chloroquine[/url]

  34. CarlJaild说:

    [url=https://clonidinenorx.com/]clonidine price in india[/url] [url=https://hydroxychloroquine.us.org/]buy hydroxychloroquine[/url] [url=https://ventolinh.com/]buy ventolin on line[/url] [url=https://erythromycinz.com/]buy erythromycin tablets online uk[/url] [url=https://amitriptyline365.com/]amitriptyline in mexico[/url]

  35. MarkJaild说:

    [url=https://avanatop.com/]avana 77573[/url] [url=https://amitriptyline365.com/]20 mg amitriptyline[/url] [url=https://celebrexcelecoxib.com/]celebrex pill[/url] [url=https://tadalafilsale.com/]buy tadalafil[/url] [url=https://doxycycline36.com/]doxycycline 100mg cap tab[/url] [url=https://dapoxetinetabs.com/]dapoxetine generic cheap[/url] [url=https://wellbutrinbupropion.com/]buy wellbutrin online cheap[/url]

  36. EyeJaild说:

    [url=http://kamagratb.com/]kamagra pills[/url] [url=http://valtrex.us.org/]valtrex without prescription[/url] [url=http://celebrexcelecoxib.com/]celebrex generic[/url] [url=http://baclofen24.com/]40 mg baclofen[/url] [url=http://xenical24.com/]buy xenical[/url] [url=http://finpecia911.com/]buy finpecia online[/url] [url=http://sildenafil36.com/]sildenafil 100 mg[/url] [url=http://furosemidelasix.com/]cost of furosemide uk[/url] [url=http://tadalafilsale.com/]buy tadalafil[/url] [url=http://doxycycline36.com/]doxycycline 250 mg[/url] [url=http://buspar.us.com/]buy buspar[/url] [url=http://atorvastatin.us.com/]lipitor buy[/url] [url=http://dapoxetinetabs.com/]dapoxetine online canada[/url] [url=http://priligytab.com/]priligy buy[/url] [url=http://ventolinh.com/]ventolin cost australia[/url] [url=http://amoxicillinz.com/]buy amoxicillin online[/url] [url=http://avanatop.com/]avana online[/url] [url=http://silagra24.com/]silagra generic[/url] [url=http://levitra36.com/]buy levitra online[/url] [url=http://vermox.us.org/]vermox uk buy[/url]

  37. PaulJaild说:

    [url=https://amitriptyline365.com/]buy amitriptyline[/url] [url=https://singulair.us.org/]singulair price[/url] [url=https://cymbaltaduloxetine.com/]buy cymbalta[/url] [url=https://chloroquine.us.com/]masaquin[/url] [url=https://xenical24.com/]xenical cost[/url]

  38. CarlJaild说:

    [url=https://valtrex.us.org/]buy valtrex online[/url] [url=https://ciprofloxacin24.com/]cipro ciprofloxacin[/url] [url=https://singulair.us.org/]singulair buy[/url] [url=https://dapoxetinetabs.com/]dapoxetine for sale[/url] [url=https://clonidinenorx.com/]clonidine hcl 0.1 mg[/url]

  39. JasonJaild说:

    [url=http://valtrex.us.org/]valtrex otc[/url] [url=http://kamagratb.com/]buy kamagra gel online australia[/url] [url=http://clonidinenorx.com/]where can i buy clonidine[/url] [url=http://atorvastatin.us.com/]buy lipitor online[/url] [url=http://tadalafilsale.com/]tadalafil generic[/url] [url=http://wellbutrinbupropion.com/]wellbutrin 10 mg pill[/url] [url=http://xenical24.com/]xenical cost[/url] [url=http://levitra36.com/]levitra buy[/url] [url=http://singulair.us.org/]singulair price[/url] [url=http://finpecia911.com/]finpecia tablet[/url]

  40. MaryJaild说:

    [url=https://clonidinenorx.com/]clonidine 0.6[/url] [url=https://valtrex.us.org/]how to get valtrex online[/url] [url=https://cymbaltaduloxetine.com/]cymbalta medication[/url] [url=https://wellbutrinbupropion.com/]buy wellbutrin[/url] [url=https://isotretinoinacutane.com/]buy accutane[/url] [url=https://baclofen24.com/]baclofen 20 mg[/url] [url=https://buspar.us.com/]buspar 15 mg[/url] [url=https://atorvastatin.us.com/]lipitor brand coupon rx[/url] [url=https://singulair.us.org/]buy singulair[/url] [url=https://celebrexcelecoxib.com/]celebrex medication[/url]

  41. CarlJaild说:

    [url=https://baclofen24.com/]baclofen price in india[/url] [url=https://furosemidelasix.com/]furosemide 20mg[/url] [url=https://finpecia911.com/]finpecia[/url] [url=https://clonidinenorx.com/]buy clonidine[/url] [url=https://chloroquine.us.com/]aralen mexico[/url]

  42. JasonJaild说:

    [url=http://xenical24.com/]xenical 84 tablets[/url] [url=http://ciprofloxacin24.com/]buy ciprofloxacin[/url] [url=http://amoxicillinz.com/]amoxicillin 500[/url] [url=http://cymbaltaduloxetine.com/]cymbalta duloxetine hcl[/url] [url=http://chloroquine.us.com/]chloroquine malaria[/url] [url=http://vermox.us.org/]vermox 500mg price[/url] [url=http://dapoxetinetabs.com/]dapoxetine no prescription[/url] [url=http://celebrexcelecoxib.com/]celebrex without prescription[/url] [url=http://doxycycline36.com/]doxycycline drug[/url] [url=http://avanatop.com/]avana online[/url]

  43. PaulJaild说:

    [url=https://furosemidelasix.com/]buy furosemide[/url] [url=https://baclofen24.com/]baclofen drug[/url] [url=https://kamagratb.com/]kamagra gel[/url] [url=https://avanatop.com/]avana 100 mg[/url] [url=https://hydroxychloroquine.us.org/]buy hydroxychloroquine[/url]

  44. PaulJaild说:

    [url=https://furosemidelasix.com/]where to buy furosemide[/url] [url=https://sildenafil36.com/]buy sildenafil 25 mg[/url] [url=https://avanatop.com/]super avana[/url] [url=https://wellbutrinbupropion.com/]buy wellbutrin[/url] [url=https://erythromycinz.com/]where to buy erythromycin[/url]

  45. AlanJaild说:

    [url=https://chloroquine.us.com/]can i buy chloroquine over the counter[/url] [url=https://levitra36.com/]levitra 20[/url] [url=https://singulair.us.org/]singulair tablets[/url] [url=https://erythromycinz.com/]buy erythromycin[/url] [url=https://wellbutrinbupropion.com/]wellbutrin uk[/url] [url=https://atorvastatin.us.com/]buy lipitor[/url] [url=https://valtrex.us.org/]valtrex online[/url] [url=https://xenical24.com/]xenical orlistat[/url] [url=https://isotretinoinacutane.com/]buy isotretinoin[/url] [url=https://doxycycline36.com/]buy doxycycline[/url] [url=https://cymbaltaduloxetine.com/]cymbalta generic 60mg[/url] [url=https://finpecia911.com/]finpecia 1 mg[/url] [url=https://buspar.us.com/]buy buspar[/url] [url=https://kamagratb.com/]kamagra 100mg for sale best price[/url] [url=https://clonidinenorx.com/]clonidine 0.1 mg[/url] [url=https://tadalafilsale.com/]tadalafil 100 mg uk[/url] [url=https://amoxicillinz.com/]amoxicillin 500mg capsules[/url] [url=https://furosemidelasix.com/]furosemide prescription medicine[/url] [url=https://hydroxychloroquine.us.org/]hydroxychloroquine online[/url] [url=https://vermox.us.org/]mebendazole tablets[/url]

  46. CarlJaild说:

    [url=https://clonidinenorx.com/]clonidine gel[/url] [url=https://tadalafilsale.com/]cheap tadalafil 20mg uk[/url] [url=https://amitriptyline365.com/]amitriptyline hydrochloride[/url] [url=https://furosemidelasix.com/]furosemide lasix[/url] [url=https://celebrexcelecoxib.com/]celebrex buy[/url]

  47. JasonJaild说:

    [url=http://singulair.us.org/]drug singulair[/url] [url=http://cymbaltaduloxetine.com/]buy cymbalta[/url] [url=http://avanatop.com/]buy avana[/url] [url=http://valtrex.us.org/]where to buy valtrex 1g[/url] [url=http://hydroxychloroquine.us.org/]hydroxychloroquine 50 mg[/url] [url=http://erythromycinz.com/]buy erythromycin[/url] [url=http://atorvastatin.us.com/]lipitor rx[/url] [url=http://isotretinoinacutane.com/]accutane pills price in south africa[/url] [url=http://amoxicillinz.com/]amoxicillin where to buy online[/url] [url=http://celebrexcelecoxib.com/]buy celebrex[/url]

  48. DenJaild说:

    [url=http://cymbaltaduloxetine.com/]buy cymbalta[/url] [url=http://silagra24.com/]silagra 100mg[/url] [url=http://isotretinoinacutane.com/]accutane in mexico[/url] [url=http://sildenafil36.com/]sildenafil 100mg[/url] [url=http://hydroxychloroquine.us.org/]plaquenil 200 mg price uk[/url]

  49. JudyJaild说:

    [url=https://erythromycinz.com/]price for erythromycin 500 mg tab[/url] [url=https://vermox.us.org/]vermox plus[/url] [url=https://avanatop.com/]avana top[/url] [url=https://hydroxychloroquine.us.org/]plaquenil price us[/url] [url=https://celebrexcelecoxib.com/]generic for celebrex[/url] [url=https://sildenafil36.com/]sildenafil citrate buy[/url] [url=https://levitra36.com/]levitra generic[/url] [url=https://dapoxetinetabs.com/]dapoxetine brand name india[/url] [url=https://valtrex.us.org/]valtrex generic price canada[/url] [url=https://priligytab.com/]priligy pills[/url]

MaryJaild进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注