From db051769244792127dcc1b03aaf14b803ed6a383 Mon Sep 17 00:00:00 2001 From: zsy Date: Fri, 24 Mar 2017 15:45:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Subscribe=20=E5=A4=9A?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=8E=A5=E6=94=B6=E4=BA=8B=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 13 +- app/src/main/AndroidManifest.xml | 4 +- .../com/shizhefei/eventbus/MainActivity.java | 2 + .../shizhefei/eventbus/ReceiverFragment.java | 64 +++++-- .../shizhefei/eventbus/SenderFragment.java | 1 + .../shizhefei/eventbus/events/ITestEvent.java | 2 +- evenbus-annotation/.gitignore | 1 + evenbus-annotation/build.gradle | 9 + evenbus-annotation/gradle.properties | 1 + .../shizhefei/eventbus/annotation/Event.java | 0 eventbus-api/build.gradle | 35 ++-- eventbus-api/gradle.properties | 1 - eventbus-api/src/main/AndroidManifest.xml | 6 + .../com/shizhefei/eventbus/EventHandler.java | 22 ++- .../com/shizhefei/eventbus/Subscribe.java | 53 ++++++ .../java/com/shizhefei/eventbus/Util.java | 46 +++++ eventbus-compiler/build.gradle | 2 +- eventbus-compiler/gradle.properties | 1 - .../eventbus/plugin/EventBusBuilder.java | 170 +++++++++++++----- .../shizhefei/eventbus/plugin/TypeUtil.java | 4 + settings.gradle | 2 +- z_publish.gradle | 2 +- 22 files changed, 344 insertions(+), 97 deletions(-) create mode 100644 evenbus-annotation/.gitignore create mode 100644 evenbus-annotation/build.gradle create mode 100644 evenbus-annotation/gradle.properties rename {eventbus-api => evenbus-annotation}/src/main/java/com/shizhefei/eventbus/annotation/Event.java (100%) create mode 100644 eventbus-api/src/main/AndroidManifest.xml create mode 100644 eventbus-api/src/main/java/com/shizhefei/eventbus/Subscribe.java diff --git a/app/build.gradle b/app/build.gradle index 8b5dd34..915eae1 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { - applicationId "com.shizhefei.eventbus" + applicationId "com.shizhefei.eventbus.demo" minSdkVersion 10 targetSdkVersion 25 versionCode 1 @@ -26,10 +26,11 @@ dependencies { }) compile 'com.android.support:appcompat-v7:25.2.0' testCompile 'junit:junit:4.12' - compile project(path: ':eventbus-api') + compile project(':eventbus-api') + compile project(':evenbus-annotation') annotationProcessor project(':eventbus-compiler') - -// compile 'com.xiaoenai:EventBus-Api:1.0.4' -// annotationProcessor 'com.xiaoenai:EventBus-Compiler:1.0.4' -// annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' + // compile 'com.xiaoenai:EventBus-Api:1.0.0' + // compile 'com.xiaoenai:EventBus-Annotation:1.0.0' + // annotationProcessor 'com.xiaoenai:EventBus-Compiler:1.0.0' + // annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 71e646b..ffa6a87 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.shizhefei.eventbus.demo"> - + diff --git a/app/src/main/java/com/shizhefei/eventbus/MainActivity.java b/app/src/main/java/com/shizhefei/eventbus/MainActivity.java index e352e6a..2b2f720 100755 --- a/app/src/main/java/com/shizhefei/eventbus/MainActivity.java +++ b/app/src/main/java/com/shizhefei/eventbus/MainActivity.java @@ -3,6 +3,8 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import com.shizhefei.eventbus.demo.R; + public class MainActivity extends AppCompatActivity { @Override diff --git a/app/src/main/java/com/shizhefei/eventbus/ReceiverFragment.java b/app/src/main/java/com/shizhefei/eventbus/ReceiverFragment.java index 1c46e62..b19435c 100755 --- a/app/src/main/java/com/shizhefei/eventbus/ReceiverFragment.java +++ b/app/src/main/java/com/shizhefei/eventbus/ReceiverFragment.java @@ -3,53 +3,85 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import com.shizhefei.eventbus.events.IAccountEvent; +import com.shizhefei.eventbus.demo.R; import com.shizhefei.eventbus.events.IMessageEvent; /** * Created by LuckyJayce on 2017/3/20. */ -public class ReceiverFragment extends Fragment implements IMessageEvent ,IAccountEvent { +public class ReceiverFragment extends Fragment implements IMessageEvent{ private TextView textView; + private StringBuilder stringBuilder = new StringBuilder(); + + private IMessageEvent iMessageEvent_main = new MyIMessageEvent(); + private IMessageEvent iMessageEvent_posting = new MyIMessageEvent2(); + private IMessageEvent iMessageEvent_background = new MyIMessageEvent3(); + private IMessageEvent iMessageEvent_async = new MyIMessageEvent4(); + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_receiver, container, false); textView = (TextView) view.findViewById(R.id.textView); - EventBus.register(this); + EventBus.register(iMessageEvent_main); + EventBus.register(iMessageEvent_posting); + EventBus.register(iMessageEvent_background); + EventBus.register(iMessageEvent_async); return view; } @Override public void onDestroyView() { super.onDestroyView(); - EventBus.unregister(this); + EventBus.unregister(iMessageEvent_main); + EventBus.unregister(iMessageEvent_posting); + EventBus.unregister(iMessageEvent_background); + EventBus.unregister(iMessageEvent_async); } - private StringBuilder stringBuilder = new StringBuilder(); - @Override public void onReceiverMessage(int messageId, String message) { stringBuilder.insert(0,"messageId:"+messageId+" message:"+message+"\n"); textView.setText(stringBuilder); } - @Override - public void logout() { - stringBuilder.insert(0,"正在执行登出操作\n"); - textView.setText(stringBuilder); - } + @Subscribe(threadMode = Subscribe.MAIN) + private class MyIMessageEvent implements IMessageEvent { + @Override + public void onReceiverMessage(int messageId, String message) { + Log.d("aaaa","Subscribe.MAIN : "+Thread.currentThread().toString()); + } + }; - @Override - public void login() { - stringBuilder.insert(0,"正在登录中..\n"); - textView.setText(stringBuilder); - } + @Subscribe(threadMode = Subscribe.POSTING) + private class MyIMessageEvent2 implements IMessageEvent { + @Override + public void onReceiverMessage(int messageId, String message) { + Log.d("aaaa","Subscribe.POSTING : "+Thread.currentThread().toString()); + } + }; + + @Subscribe(threadMode = Subscribe.BACKGROUND) + private class MyIMessageEvent3 implements IMessageEvent { + @Override + public void onReceiverMessage(int messageId, String message) { + Log.d("aaaa","Subscribe.BACKGROUND : "+Thread.currentThread().toString()); + } + }; + + @Subscribe(threadMode = Subscribe.ASYNC) + private class MyIMessageEvent4 implements IMessageEvent { + @Override + public void onReceiverMessage(int messageId, String message) { + Log.d("aaaa","Subscribe.ASYNC : "+Thread.currentThread().toString()); + } + }; } diff --git a/app/src/main/java/com/shizhefei/eventbus/SenderFragment.java b/app/src/main/java/com/shizhefei/eventbus/SenderFragment.java index 03646fb..0bfe883 100755 --- a/app/src/main/java/com/shizhefei/eventbus/SenderFragment.java +++ b/app/src/main/java/com/shizhefei/eventbus/SenderFragment.java @@ -9,6 +9,7 @@ import android.widget.Button; import android.widget.EditText; +import com.shizhefei.eventbus.demo.R; import com.shizhefei.eventbus.events.IAccountEvent; import com.shizhefei.eventbus.events.IMessageEvent; diff --git a/app/src/main/java/com/shizhefei/eventbus/events/ITestEvent.java b/app/src/main/java/com/shizhefei/eventbus/events/ITestEvent.java index e64616c..b574432 100755 --- a/app/src/main/java/com/shizhefei/eventbus/events/ITestEvent.java +++ b/app/src/main/java/com/shizhefei/eventbus/events/ITestEvent.java @@ -8,7 +8,7 @@ */ @Event public interface ITestEvent extends IEvent{ - void onTest(E event, H h, int messageId, String message) throws Exception; + void onTest(E event, H h, int messageId, String message); void onTest(E event, H h, int messageId); diff --git a/evenbus-annotation/.gitignore b/evenbus-annotation/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/evenbus-annotation/.gitignore @@ -0,0 +1 @@ +/build diff --git a/evenbus-annotation/build.gradle b/evenbus-annotation/build.gradle new file mode 100644 index 0000000..795416b --- /dev/null +++ b/evenbus-annotation/build.gradle @@ -0,0 +1,9 @@ +apply plugin: 'java' +apply from: rootProject.file('z_publish.gradle') + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) +} + +sourceCompatibility = "1.7" +targetCompatibility = "1.7" diff --git a/evenbus-annotation/gradle.properties b/evenbus-annotation/gradle.properties new file mode 100644 index 0000000..56c234f --- /dev/null +++ b/evenbus-annotation/gradle.properties @@ -0,0 +1 @@ +POM_ARTIFACT_ID=EventBus-Annotation diff --git a/eventbus-api/src/main/java/com/shizhefei/eventbus/annotation/Event.java b/evenbus-annotation/src/main/java/com/shizhefei/eventbus/annotation/Event.java similarity index 100% rename from eventbus-api/src/main/java/com/shizhefei/eventbus/annotation/Event.java rename to evenbus-annotation/src/main/java/com/shizhefei/eventbus/annotation/Event.java diff --git a/eventbus-api/build.gradle b/eventbus-api/build.gradle index 5a2ff0f..4400044 100755 --- a/eventbus-api/build.gradle +++ b/eventbus-api/build.gradle @@ -1,20 +1,27 @@ -apply plugin: 'java' +apply plugin: 'com.android.library' apply from: rootProject.file('z_publish.gradle') -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) -} - -sourceCompatibility = "1.7" -targetCompatibility = "1.7" +android { + compileSdkVersion 24 + buildToolsVersion "24.0.0" - -allprojects { - tasks.withType(Javadoc) { - options { - encoding "UTF-8" - charSet 'UTF-8' - links "http://docs.oracle.com/javase/7/docs/api" + defaultConfig { + minSdkVersion 10 + targetSdkVersion 24 + versionCode 8 + versionName "1.0.7" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + abortOnError false + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') } \ No newline at end of file diff --git a/eventbus-api/gradle.properties b/eventbus-api/gradle.properties index ae1b19b..3e0e075 100644 --- a/eventbus-api/gradle.properties +++ b/eventbus-api/gradle.properties @@ -1,2 +1 @@ POM_ARTIFACT_ID=EventBus-Api -POM_PACKAGING=jar diff --git a/eventbus-api/src/main/AndroidManifest.xml b/eventbus-api/src/main/AndroidManifest.xml new file mode 100644 index 0000000..75ea1f2 --- /dev/null +++ b/eventbus-api/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/eventbus-api/src/main/java/com/shizhefei/eventbus/EventHandler.java b/eventbus-api/src/main/java/com/shizhefei/eventbus/EventHandler.java index 9e5b7c4..acfb6d7 100755 --- a/eventbus-api/src/main/java/com/shizhefei/eventbus/EventHandler.java +++ b/eventbus-api/src/main/java/com/shizhefei/eventbus/EventHandler.java @@ -14,12 +14,24 @@ class EventHandler implements IEventHandler { - static final Map, EventProxy> interfaceImpMap = new HashMap<>(); + interface EventImpFactory { + IEVENT create(); + } + + static final Map, EventImpFactory> factoryMap = new HashMap<>(); - private final static Map> registers = new HashMap<>(); + private final Map, EventHandler.EventProxy> interfaceImpMap = new HashMap<>(); - public IEVENT get(Class eventClass) { - return (IEVENT) interfaceImpMap.get(eventClass); + private final Map> registers = new HashMap<>(); + + public synchronized IEVENT get(Class eventClass) { + EventProxy eventProxy = interfaceImpMap.get(eventClass); + if (eventProxy == null) { + EventImpFactory eventImpFactory = factoryMap.get(eventClass); + eventProxy = eventImpFactory.create(); + interfaceImpMap.put(eventClass, eventProxy); + } + return eventClass.cast(eventProxy); } public synchronized void register(IEvent subscriber) { @@ -29,7 +41,7 @@ public synchronized void register(IEvent subscriber) { ArrayList> interfaces = Util.getInterfaces(subscriber); Set eventProxySet = new HashSet<>(); for (Class in : interfaces) { - EventProxy eventProxy = interfaceImpMap.get(in); + EventProxy eventProxy = (EventProxy) get(in); if (eventProxy != null) { eventProxy.register(subscriber); eventProxySet.add(eventProxy); diff --git a/eventbus-api/src/main/java/com/shizhefei/eventbus/Subscribe.java b/eventbus-api/src/main/java/com/shizhefei/eventbus/Subscribe.java new file mode 100644 index 0000000..d0804f2 --- /dev/null +++ b/eventbus-api/src/main/java/com/shizhefei/eventbus/Subscribe.java @@ -0,0 +1,53 @@ +/** + * Copyright 2015 shizhefei(LuckyJayce) + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.shizhefei.eventbus; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * 标记事件的调用环境,可以注解在类上。 + * Created by LuckyJayce on 2016/7/23. + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Subscribe { + /** + * 发事件后直接调用,收发在同一线程中 + */ + int POSTING = 0; + /** + * 无论之前什么线程发送,都在主线程接收 + */ + int MAIN = 1; + /** + * 在后台线程接收,如果发送的线程不是主线程直接调用这个,如果是主线程就开个线程执行这个方法 + */ + int BACKGROUND = 2; + /** + * 无论如何都会在开个线程执行(会有个线程池,不一定是真的开个线程,可能取线程池中空闲的线程) + */ + int ASYNC = 3; + + /** + * 执行在哪个线程 + */ + int threadMode(); + +} diff --git a/eventbus-api/src/main/java/com/shizhefei/eventbus/Util.java b/eventbus-api/src/main/java/com/shizhefei/eventbus/Util.java index d88cd82..805a324 100755 --- a/eventbus-api/src/main/java/com/shizhefei/eventbus/Util.java +++ b/eventbus-api/src/main/java/com/shizhefei/eventbus/Util.java @@ -1,5 +1,10 @@ package com.shizhefei.eventbus; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; + import java.util.ArrayList; @@ -24,4 +29,45 @@ static ArrayList> getInterfaces(IEvent event) { static boolean isExtendsInterface(Class in, Class superClass) { return superClass.isAssignableFrom(in); } + + /** + * 判断是直接执行,还是需要post一个runnable + * @param subscribe + * @return true 直接执行,false 需要post一个runnable + */ + static boolean isSyncInvoke(Subscribe subscribe) { + if (subscribe == null) { + return true; + } + boolean isMainThread = Looper.getMainLooper() == Looper.myLooper(); + boolean isInv; + switch (subscribe.threadMode()) { + case Subscribe.POSTING: + default: + isInv = true; + break; + case Subscribe.MAIN: + isInv = isMainThread; + break; + case Subscribe.BACKGROUND: + isInv = !isMainThread; + break; + case Subscribe.ASYNC: + isInv = false; + break; + } + return isInv; + } + + private static Handler mainHandler = new Handler(Looper.getMainLooper()); + + static void postMain(Runnable runnable){ + mainHandler.post(runnable); + } + + static void postThread(Runnable runnable){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + AsyncTask.THREAD_POOL_EXECUTOR.execute(runnable); + } + } } diff --git a/eventbus-compiler/build.gradle b/eventbus-compiler/build.gradle index 4466383..463f442 100755 --- a/eventbus-compiler/build.gradle +++ b/eventbus-compiler/build.gradle @@ -7,5 +7,5 @@ dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.google.auto.service:auto-service:1.0-rc2' compile 'com.squareup:javapoet:1.7.0' - compile project(':eventbus-api') + compile project(':evenbus-annotation') } \ No newline at end of file diff --git a/eventbus-compiler/gradle.properties b/eventbus-compiler/gradle.properties index f77dd0c..1df9ab3 100644 --- a/eventbus-compiler/gradle.properties +++ b/eventbus-compiler/gradle.properties @@ -1,2 +1 @@ POM_ARTIFACT_ID=EventBus-Compiler -POM_PACKAGING=jar diff --git a/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/EventBusBuilder.java b/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/EventBusBuilder.java index f9e699b..ba298e0 100755 --- a/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/EventBusBuilder.java +++ b/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/EventBusBuilder.java @@ -22,7 +22,6 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; import javax.lang.model.element.Name; -import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeParameterElement; import javax.lang.model.element.VariableElement; @@ -32,6 +31,7 @@ import static com.squareup.javapoet.ParameterizedTypeName.get; import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PRIVATE; +import static javax.lang.model.element.Modifier.PUBLIC; import static javax.lang.model.element.Modifier.STATIC; /** @@ -66,11 +66,10 @@ public JavaFile build(List typeElements) { CodeBlock.Builder staticBlockBuilder = CodeBlock.builder(); for (TypeElement typeElement : typeElements) { - eventBusBuilder.addType(createEventImp(typeElement)); - PackageElement packageElement = (PackageElement) typeElement.getEnclosingElement(); - ClassName eventImpClassName = ClassName.get(packageElement.getQualifiedName().toString(), typeElement.getSimpleName().toString()); -// 生成 EventHandler.registers.put(IMessageEvent.class, new MessageEventImp()) 代码; - staticBlockBuilder.add("$T.interfaceImpMap.put($T.class, new $L());\n", TypeUtil.eventHandler, eventImpClassName, createClassName(typeElement.getQualifiedName())); + eventBusBuilder.addType(createEventImpFactory(typeElement)); + ClassName eventImpClassName = ClassName.get(typeElement); +// 生成 EventHandler.registers.put(IMessageEvent.class, new MessageEventImpFactory()) 代码; + staticBlockBuilder.add("$T.factoryMap.put($T.class, new $L());\n", TypeUtil.eventHandler, eventImpClassName, createFactoryClassName(typeElement.getQualifiedName())); } eventBusBuilder.addStaticBlock(staticBlockBuilder.build()); JavaFile javaFile = JavaFile.builder(packageName, eventBusBuilder.build()).indent("\t").build(); @@ -155,6 +154,28 @@ private MethodSpec createGetEventImp() { return builder.build(); } + + // private static final class com_shizhefei_eventbus_events_IMessageEventFactory implements EventHandler.EventImpFactory> { +// +// @Override +// public EventHandler.EventProxy create() { +// return new EventImp(); +// } + private TypeSpec createEventImpFactory(TypeElement typeElement) { + TypeName eventClass = TypeName.get(typeElement.asType()); + TypeSpec.Builder eventImpFactory = TypeSpec.classBuilder(createFactoryClassName(typeElement.getQualifiedName())).addModifiers(FINAL, STATIC, PRIVATE); + for (TypeParameterElement typeParameterElement : typeElement.getTypeParameters()) { + eventImpFactory.addTypeVariable(toTypeVariableName(typeParameterElement)); + } + ParameterizedTypeName eventImpTypeName = ParameterizedTypeName.get(TypeUtil.EventProxy, eventClass); + eventImpFactory.addSuperinterface(ParameterizedTypeName.get(TypeUtil.EventProxyFactory, eventImpTypeName)); + MethodSpec.Builder builder = MethodSpec.methodBuilder("create").addModifiers(PUBLIC).addAnnotation(Override.class).returns(eventImpTypeName); + builder.addStatement("return new EventImp()"); + eventImpFactory.addMethod(builder.build()); + eventImpFactory.addType(createEventImp(typeElement, "EventImp", eventImpTypeName, eventClass)); + return eventImpFactory.build(); + } + /** *

      * private static class MessageEventImp extends EventHandler.EventProxy implements IMessageEvent {
@@ -166,14 +187,13 @@ private MethodSpec createGetEventImp() {
      *    }
      * }
      */
-    private TypeSpec createEventImp(TypeElement typeElement) {
-        TypeName eventClass = TypeName.get(typeElement.asType());
-        TypeSpec.Builder eventImp = TypeSpec.classBuilder(createClassName(typeElement.getQualifiedName())).addModifiers(FINAL, STATIC, PRIVATE);
+    private TypeSpec createEventImp(TypeElement typeElement, String eventImpName, ParameterizedTypeName eventImpTypeName, TypeName eventClass) {
+        TypeSpec.Builder eventImp = TypeSpec.classBuilder(eventImpName).addModifiers(FINAL, STATIC, PRIVATE);
         eventImp.addSuperinterface(eventClass);
         for (TypeParameterElement typeParameterElement : typeElement.getTypeParameters()) {
             eventImp.addTypeVariable(toTypeVariableName(typeParameterElement));
         }
-        eventImp.superclass(ParameterizedTypeName.get(TypeUtil.EventProxy, eventClass));
+        eventImp.superclass(eventImpTypeName);
         for (Element element : typeElement.getEnclosedElements()) {
             ExecutableElement executableElement = (ExecutableElement) element;
             MethodSpec methodSpec = createEventImpMethod(eventClass, executableElement);
@@ -182,7 +202,30 @@ private TypeSpec createEventImp(TypeElement typeElement) {
         return eventImp.build();
     }
 
-
+    //            @Override
+//            public void onReceiverMessage(int messageId, String message) {
+//                for (IMessageEvent iEvent : iEvents) {
+//                    Subscribe subscribe = iEvent.getClass().getAnnotation(Subscribe.class);
+//                    if (Util.isSyncInvoke(subscribe)) {
+//                        iEvent.onReceiverMessage(messageId, message);
+//                    } else {
+//                        final IMessageEvent postIEvent = iEvent;
+//                        final int postMessageId = messageId;
+//                        final String postMessage = message;
+//                        Runnable runnable = new Runnable() {
+//                            @Override
+//                            public void run() {
+//                                postIEvent.onReceiverMessage(postMessageId, postMessage);
+//                            }
+//                        };
+//                        if (subscribe.threadMode() == Subscribe.MAIN) {
+//                            Util.postMain(runnable);
+//                        } else {
+//                            Util.postThread(runnable);
+//                        }
+//                    }
+//                }
+//            }
     private MethodSpec createEventImpMethod(TypeName eventClass, ExecutableElement executableElement) {
         MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder(executableElement.getSimpleName().toString());
         methodBuilder.addAnnotation(Override.class);
@@ -199,19 +242,46 @@ private MethodSpec createEventImpMethod(TypeName eventClass, ExecutableElement e
 
         List typeParameters = executableElement.getParameters();
         StringBuilder stringBuilder = new StringBuilder("iEvent.").append(executableElement.getSimpleName().toString()).append("(");
+        StringBuilder stringBuilder2 = new StringBuilder("post_iEvent.").append(executableElement.getSimpleName().toString()).append("(");
         for (VariableElement typeParameter : typeParameters) {
             String paramsName = typeParameter.getSimpleName().toString();
             methodBuilder.addParameter(TypeName.get(typeParameter.asType()), paramsName);
             stringBuilder.append(paramsName).append(", ");
+            stringBuilder2.append("post_").append(paramsName).append(", ");
         }
         if (stringBuilder.charAt(stringBuilder.length() - 2) == ',' && stringBuilder.charAt(stringBuilder.length() - 1) == ' ') {
             stringBuilder.deleteCharAt(stringBuilder.length() - 1);
             stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+            stringBuilder2.deleteCharAt(stringBuilder2.length() - 1);
+            stringBuilder2.deleteCharAt(stringBuilder2.length() - 1);
         }
         stringBuilder.append(")");
+        stringBuilder2.append(")");
         messager.printMessage(Diagnostic.Kind.NOTE, " createEventImpMethod stringBuilder:" + stringBuilder + "  executableElement:" + executableElement);
         methodBuilder.beginControlFlow("for($T iEvent : iEvents)", eventClass);
+        methodBuilder.addStatement("$T subscribe = iEvent.getClass().getAnnotation($T.class)", TypeUtil.Subscribe, TypeUtil.Subscribe);
+        methodBuilder.beginControlFlow("if($T.isSyncInvoke(subscribe))", TypeUtil.Util);
         methodBuilder.addStatement(stringBuilder.toString());
+        methodBuilder.nextControlFlow("else");
+        methodBuilder.addStatement("final $T post_iEvent = iEvent", eventClass);
+        for (VariableElement typeParameter : typeParameters) {
+            String p = typeParameter.getSimpleName().toString();
+            methodBuilder.addStatement("final $T $L = $L", TypeName.get(typeParameter.asType()), "post_" + p, p);
+        }
+        methodBuilder.beginControlFlow("$T runnable = new $T()", Runnable.class, Runnable.class);
+        methodBuilder.addCode("@Override\n");
+        methodBuilder.beginControlFlow("public void run()");
+        methodBuilder.addStatement(stringBuilder2.toString());
+        methodBuilder.endControlFlow();
+        methodBuilder.endControlFlow("");
+
+        methodBuilder.beginControlFlow("if (subscribe.threadMode() == Subscribe.MAIN)");
+        methodBuilder.addStatement("$T.postMain(runnable)", TypeUtil.Util);
+        methodBuilder.nextControlFlow("else");
+        methodBuilder.addStatement("$T.postThread(runnable)", TypeUtil.Util);
+        methodBuilder.endControlFlow();
+
+        methodBuilder.endControlFlow();
         methodBuilder.endControlFlow();
         return methodBuilder.build();
     }
@@ -238,36 +308,21 @@ private TypeVariableName toTypeVariableName(TypeParameterElement typeParameterEl
      * @param name
      * @return
      */
-    private String createClassName(Name name) {
+    private String createFactoryClassName(Name name) {
         String s = name.toString();
         s = s.replaceAll("\\.", "_");
-        return s + "Imp";
+        return s + "ImpFactory";
     }
 }
 
 //以下是生成的目标类
 //public class EventBus {
-//    static {
-//        EventHandler.interfaceImpMap.put(IAccountEvent.class, new com_shizhefei_eventbus_events_IAccountEventImp());
-//        EventHandler.interfaceImpMap.put(IMessageEvent.class, new com_shizhefei_eventbus_events_IMessageEventImp());
-//    }
+//    private static final EventHandler defaultEventHandler = new EventHandler();
 //
-//    private static EventHandler defaultEventHandler = new EventHandler();
-//    private static WeakHashMap eventHandlerMap = new WeakHashMap<>();
+//    private static final WeakHashMap eventHandlerMap = new WeakHashMap();
 //
-//    /**
-//     * 获取Activity内通信的EventHandler
-//     *
-//     * @param activity
-//     * @return
-//     */
-//    public static synchronized IEventHandler withActivity(Activity activity) {
-//        EventHandler eventBusImp = eventHandlerMap.get(activity);
-//        if (eventBusImp == null) {
-//            eventBusImp = new EventHandler();
-//            eventHandlerMap.put(activity, eventBusImp);
-//        }
-//        return eventBusImp;
+//    static {
+//        EventHandler.factoryMap.put(IMessageEvent.class, new com_shizhefei_eventbus_events_IMessageEventFactory());
 //    }
 //
 //    public static void register(IEvent iEvent) {
@@ -282,27 +337,46 @@ private String createClassName(Name name) {
 //        return defaultEventHandler.get(eventClass);
 //    }
 //
-//    private static final class com_shizhefei_eventbus_events_IAccountEventImp extends EventHandler.EventProxy implements IAccountEvent {
-//        @Override
-//        public void logout() {
-//            for(IAccountEvent iEvent : iEvents) {
-//                iEvent.logout();
-//            }
+//    public static synchronized IEventHandler withActivity(@NonNull Activity activity) {
+//        IEventHandler eventBusImp = eventHandlerMap.get(activity);
+//        if (eventBusImp == null) {
+//            eventBusImp = new EventHandler();
+//            eventHandlerMap.put(activity, eventBusImp);
 //        }
+//        return eventBusImp;
+//    }
+//
+//    private static final class com_shizhefei_eventbus_events_IMessageEventFactory implements EventHandler.EventImpFactory> {
 //
 //        @Override
-//        public void login() {
-//            for(IAccountEvent iEvent : iEvents) {
-//                iEvent.login();
-//            }
+//        public EventHandler.EventProxy create() {
+//            return new EventImp();
 //        }
-//    }
 //
-//    private static final class com_shizhefei_eventbus_events_IMessageEventImp extends EventHandler.EventProxy implements IMessageEvent {
-//        @Override
-//        public void onReceiverMessage(int messageId, String message) {
-//            for(IMessageEvent iEvent : iEvents) {
-//                iEvent.onReceiverMessage(messageId, message);
+//        private static final class EventImp extends EventHandler.EventProxy implements IMessageEvent {
+//            @Override
+//            public void onReceiverMessage(int messageId, String message) {
+//                for (IMessageEvent iEvent : iEvents) {
+//                    Subscribe subscribe = iEvent.getClass().getAnnotation(Subscribe.class);
+//                    if (Util.isSyncInvoke(subscribe)) {
+//                        iEvent.onReceiverMessage(messageId, message);
+//                    } else {
+//                        final IMessageEvent postIEvent = iEvent;
+//                        final int postMessageId = messageId;
+//                        final String postMessage = message;
+//                        Runnable runnable = new Runnable() {
+//                            @Override
+//                            public void run() {
+//                                postIEvent.onReceiverMessage(postMessageId, postMessage);
+//                            }
+//                        };
+//                        if (subscribe.threadMode() == Subscribe.MAIN) {
+//                            Util.postMain(runnable);
+//                        } else {
+//                            Util.postThread(runnable);
+//                        }
+//                    }
+//                }
 //            }
 //        }
 //    }
diff --git a/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/TypeUtil.java b/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/TypeUtil.java
index d9951c6..6b0851f 100755
--- a/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/TypeUtil.java
+++ b/eventbus-compiler/src/main/java/com/shizhefei/eventbus/plugin/TypeUtil.java
@@ -9,8 +9,12 @@
 public class TypeUtil {
     public static final ClassName eventHandler = ClassName.get("com.shizhefei.eventbus", "EventHandler");
     public static final ClassName ieventHandler = ClassName.get("com.shizhefei.eventbus", "IEventHandler");
+    public static final ClassName Subscribe = ClassName.get("com.shizhefei.eventbus", "Subscribe");
+    public static final ClassName Util = ClassName.get("com.shizhefei.eventbus", "Util");
     public static final ClassName activity = ClassName.get("android.app", "Activity");
     public static final ClassName EventProxy = ClassName.get("com.shizhefei.eventbus", "EventHandler.EventProxy");
+    public static final ClassName EventProxyFactory = ClassName.get("com.shizhefei.eventbus", "EventHandler.EventImpFactory");
     public static final ClassName ievent = ClassName.get("com.shizhefei.eventbus", "IEvent");
     public static final ClassName NonNull = ClassName.get("android.support.annotation", "NonNull");
+    public static final String Event = "com.shizhefei.eventbus.annotation.Event";
 }
diff --git a/settings.gradle b/settings.gradle
index cdf0fef..70dd05d 100755
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':eventbus-compiler', ':eventbus-api'
+include ':app', ':eventbus-compiler', ':eventbus-api', ':evenbus-annotation'
diff --git a/z_publish.gradle b/z_publish.gradle
index 785973d..82221f4 100644
--- a/z_publish.gradle
+++ b/z_publish.gradle
@@ -1,6 +1,6 @@
 def infoFile = new File(rootProject.projectDir, "../publish_info.properties");
 
-def versionName = '1.0.0'
+def versionName = '1.0.1'
 
 //执行 ./gradlew uploadArchives 进行发布
 if (infoFile.exists()) {