├── .apt_generated └── com │ └── bluemor │ └── mvpdecoupling │ └── ui │ └── MainActivity_.java ├── .classpath ├── .factorypath ├── .gitignore ├── .project ├── .settings ├── org.eclipse.jdt.apt.core.prefs └── org.eclipse.jdt.core.prefs ├── AndroidManifest.xml ├── README.md ├── compile-libs └── androidannotations-3.2.jar ├── ic_launcher-web.png ├── libs ├── android-support-v4.jar └── androidannotations-api-3.2.jar ├── proguard-project.txt ├── project.properties ├── res ├── drawable-hdpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ ├── custom.png │ ├── dota.jpg │ ├── empty.png │ ├── error.png │ ├── ic_launcher.png │ └── nonet.png ├── drawable-xxhdpi │ └── ic_launcher.png ├── layout │ ├── activity_main.xml │ ├── container_custom.xml │ ├── container_empty.xml │ ├── container_error.xml │ ├── container_loading.xml │ └── container_nonet.xml ├── menu │ └── main.xml ├── values-sw600dp │ └── dimens.xml ├── values-sw720dp-land │ └── dimens.xml ├── values-v11 │ └── styles.xml ├── values-v14 │ └── styles.xml └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml └── src └── com └── bluemor └── mvpdecoupling ├── bean └── Doter.java ├── commen ├── LoadDataCallback.java ├── LoadDataView.java └── ViewContainer.java ├── interactor ├── DoterInfoInteractor.java └── DoterInfoInteractorImpl.java ├── presenter ├── DoterInfoCallback.java ├── DoterInfoPresenter.java ├── DoterInfoPresenterImpl.java └── DoterInfoView.java └── ui └── MainActivity.java /.apt_generated/com/bluemor/mvpdecoupling/ui/MainActivity_.java: -------------------------------------------------------------------------------- 1 | // 2 | // DO NOT EDIT THIS FILE, IT HAS BEEN GENERATED USING AndroidAnnotations 3.2. 3 | // 4 | 5 | 6 | package com.bluemor.mvpdecoupling.ui; 7 | 8 | import android.content.Context; 9 | import android.os.Bundle; 10 | import android.os.Handler; 11 | import android.os.Looper; 12 | import android.support.v4.app.Fragment; 13 | import android.view.View; 14 | import android.view.View.OnClickListener; 15 | import android.view.ViewGroup.LayoutParams; 16 | import android.widget.TextView; 17 | import com.bluemor.mvpdecoupling.R.id; 18 | import com.bluemor.mvpdecoupling.bean.Doter; 19 | import org.androidannotations.api.BackgroundExecutor; 20 | import org.androidannotations.api.builder.ActivityIntentBuilder; 21 | import org.androidannotations.api.view.HasViews; 22 | import org.androidannotations.api.view.OnViewChangedListener; 23 | import org.androidannotations.api.view.OnViewChangedNotifier; 24 | 25 | public final class MainActivity_ 26 | extends MainActivity 27 | implements HasViews, OnViewChangedListener 28 | { 29 | 30 | private final OnViewChangedNotifier onViewChangedNotifier_ = new OnViewChangedNotifier(); 31 | private Handler handler_ = new Handler(Looper.getMainLooper()); 32 | 33 | @java.lang.Override 34 | public void onCreate(Bundle savedInstanceState) { 35 | OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_); 36 | init_(savedInstanceState); 37 | super.onCreate(savedInstanceState); 38 | OnViewChangedNotifier.replaceNotifier(previousNotifier); 39 | } 40 | 41 | private void init_(Bundle savedInstanceState) { 42 | OnViewChangedNotifier.registerOnViewChangedListener(this); 43 | } 44 | 45 | @java.lang.Override 46 | public void setContentView(int layoutResID) { 47 | super.setContentView(layoutResID); 48 | onViewChangedNotifier_.notifyViewChanged(this); 49 | } 50 | 51 | @java.lang.Override 52 | public void setContentView(View view, LayoutParams params) { 53 | super.setContentView(view, params); 54 | onViewChangedNotifier_.notifyViewChanged(this); 55 | } 56 | 57 | @java.lang.Override 58 | public void setContentView(View view) { 59 | super.setContentView(view); 60 | onViewChangedNotifier_.notifyViewChanged(this); 61 | } 62 | 63 | public static MainActivity_.IntentBuilder_ intent(Context context) { 64 | return new MainActivity_.IntentBuilder_(context); 65 | } 66 | 67 | public static MainActivity_.IntentBuilder_ intent(Fragment supportFragment) { 68 | return new MainActivity_.IntentBuilder_(supportFragment); 69 | } 70 | 71 | @java.lang.Override 72 | public void onViewChanged(HasViews hasViews) { 73 | tv_info = ((TextView) hasViews.findViewById(id.tv_info)); 74 | { 75 | View view = hasViews.findViewById(id.bt); 76 | if (view!= null) { 77 | view.setOnClickListener(new OnClickListener() { 78 | 79 | 80 | @java.lang.Override 81 | public void onClick(View view) { 82 | MainActivity_.this.clickButton(); 83 | } 84 | 85 | } 86 | ); 87 | } 88 | } 89 | initPresenter(); 90 | } 91 | 92 | @java.lang.Override 93 | public void showNonet() { 94 | handler_.post(new Runnable() { 95 | 96 | 97 | @java.lang.Override 98 | public void run() { 99 | MainActivity_.super.showNonet(); 100 | } 101 | 102 | } 103 | ); 104 | } 105 | 106 | @java.lang.Override 107 | public void showDoterInfo(final Doter info) { 108 | handler_.post(new Runnable() { 109 | 110 | 111 | @java.lang.Override 112 | public void run() { 113 | MainActivity_.super.showDoterInfo(info); 114 | } 115 | 116 | } 117 | ); 118 | } 119 | 120 | @java.lang.Override 121 | public void showContent() { 122 | handler_.post(new Runnable() { 123 | 124 | 125 | @java.lang.Override 126 | public void run() { 127 | MainActivity_.super.showContent(); 128 | } 129 | 130 | } 131 | ); 132 | } 133 | 134 | @java.lang.Override 135 | public void showEmpty() { 136 | handler_.post(new Runnable() { 137 | 138 | 139 | @java.lang.Override 140 | public void run() { 141 | MainActivity_.super.showEmpty(); 142 | } 143 | 144 | } 145 | ); 146 | } 147 | 148 | @java.lang.Override 149 | public void showLoading() { 150 | handler_.post(new Runnable() { 151 | 152 | 153 | @java.lang.Override 154 | public void run() { 155 | MainActivity_.super.showLoading(); 156 | } 157 | 158 | } 159 | ); 160 | } 161 | 162 | @java.lang.Override 163 | public void showError() { 164 | handler_.post(new Runnable() { 165 | 166 | 167 | @java.lang.Override 168 | public void run() { 169 | MainActivity_.super.showError(); 170 | } 171 | 172 | } 173 | ); 174 | } 175 | 176 | @java.lang.Override 177 | public void clickButton() { 178 | BackgroundExecutor.execute(new BackgroundExecutor.Task("", 0, "") { 179 | 180 | 181 | @java.lang.Override 182 | public void execute() { 183 | try { 184 | MainActivity_.super.clickButton(); 185 | } catch (Throwable e) { 186 | Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); 187 | } 188 | } 189 | 190 | } 191 | ); 192 | } 193 | 194 | public static class IntentBuilder_ 195 | extends ActivityIntentBuilder 196 | { 197 | 198 | private Fragment fragmentSupport_; 199 | 200 | public IntentBuilder_(Context context) { 201 | super(context, MainActivity_.class); 202 | } 203 | 204 | public IntentBuilder_(Fragment fragment) { 205 | super(fragment.getActivity(), MainActivity_.class); 206 | fragmentSupport_ = fragment; 207 | } 208 | 209 | @java.lang.Override 210 | public void startForResult(int requestCode) { 211 | if (fragmentSupport_!= null) { 212 | fragmentSupport_.startActivityForResult(intent, requestCode); 213 | } else { 214 | super.startForResult(requestCode); 215 | } 216 | } 217 | 218 | } 219 | 220 | } 221 | -------------------------------------------------------------------------------- /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.factorypath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | 19 | # Local configuration file (sdk path, etc) 20 | local.properties 21 | 22 | # Proguard folder generated by Eclipse 23 | proguard/ 24 | 25 | # Log Files 26 | *.log 27 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | MvpDecoupling 4 | 5 | 6 | 7 | 8 | 9 | com.android.ide.eclipse.adt.ResourceManagerBuilder 10 | 11 | 12 | 13 | 14 | com.android.ide.eclipse.adt.PreCompilerBuilder 15 | 16 | 17 | 18 | 19 | org.eclipse.jdt.core.javabuilder 20 | 21 | 22 | 23 | 24 | com.android.ide.eclipse.adt.ApkBuilder 25 | 26 | 27 | 28 | 29 | 30 | com.android.ide.eclipse.adt.AndroidNature 31 | org.eclipse.jdt.core.javanature 32 | 33 | 34 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.apt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.apt.aptEnabled=true 3 | org.eclipse.jdt.apt.genSrcDir=.apt_generated 4 | org.eclipse.jdt.apt.reconcileEnabled=true 5 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.processAnnotations=enabled 3 | -------------------------------------------------------------------------------- /AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Android-MVP-Decoupling 2 | ====================== 3 | 4 | 使用MVP设计模式使UI和业务(Interactor)完全解耦 5 | 6 | 需要配置androidannotations 7 | -------------------------------------------------------------------------------- /compile-libs/androidannotations-3.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/compile-libs/androidannotations-3.2.jar -------------------------------------------------------------------------------- /ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/ic_launcher-web.png -------------------------------------------------------------------------------- /libs/android-support-v4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/libs/android-support-v4.jar -------------------------------------------------------------------------------- /libs/androidannotations-api-3.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/libs/androidannotations-api-3.2.jar -------------------------------------------------------------------------------- /proguard-project.txt: -------------------------------------------------------------------------------- 1 | # To enable ProGuard in your project, edit project.properties 2 | # to define the proguard.config property as described in that file. 3 | # 4 | # Add project specific ProGuard rules here. 5 | # By default, the flags in this file are appended to flags specified 6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt 7 | # You can edit the include path and order by changing the ProGuard 8 | # include property in project.properties. 9 | # 10 | # For more details, see 11 | # http://developer.android.com/guide/developing/tools/proguard.html 12 | 13 | # Add any project specific keep options here: 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | -------------------------------------------------------------------------------- /project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-19 15 | -------------------------------------------------------------------------------- /res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/custom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-xhdpi/custom.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/dota.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-xhdpi/dota.jpg -------------------------------------------------------------------------------- /res/drawable-xhdpi/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-xhdpi/empty.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-xhdpi/error.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/nonet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-xhdpi/nonet.png -------------------------------------------------------------------------------- /res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlueMor/Android-MVP-Decoupling/a2f3305dfdc3d5753d503b691cfc78acf0cd6a8f/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | 17 | 25 | 26 | -------------------------------------------------------------------------------- /res/layout/container_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | 16 | -------------------------------------------------------------------------------- /res/layout/container_error.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | 16 | -------------------------------------------------------------------------------- /res/layout/container_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /res/layout/container_nonet.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | 16 | -------------------------------------------------------------------------------- /res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /res/values-sw600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /res/values-sw720dp-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 128dp 8 | 9 | 10 | -------------------------------------------------------------------------------- /res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /res/values-v14/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16dp 5 | 16dp 6 | 7 | 8 | -------------------------------------------------------------------------------- /res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MvpDecoupling 5 | Settings 6 | Hello world! 7 | 8 | 9 | -------------------------------------------------------------------------------- /res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 14 | 15 | 16 | 19 | 20 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/bean/Doter.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.bean; 2 | 3 | public class Doter { 4 | private String dotaId; 5 | private String dotaAge; 6 | 7 | @Override 8 | public String toString() { 9 | return "Response -----\r\n dotaId: " + dotaId + "\r\n dotaAge: " + dotaAge; 10 | } 11 | 12 | public Doter(String dotaId, String dotaAge) { 13 | super(); 14 | this.dotaId = dotaId; 15 | this.dotaAge = dotaAge; 16 | } 17 | 18 | public String getDotaId() { 19 | return dotaId; 20 | } 21 | 22 | public void setDotaId(String dotaId) { 23 | this.dotaId = dotaId; 24 | } 25 | 26 | public String getDotaAge() { 27 | return dotaAge; 28 | } 29 | 30 | public void setDotaAge(String dotaAge) { 31 | this.dotaAge = dotaAge; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/commen/LoadDataCallback.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.commen; 2 | 3 | 4 | public interface LoadDataCallback { 5 | 6 | void onError(); 7 | 8 | void onNonet(); 9 | 10 | void onEmpty(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/commen/LoadDataView.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.commen; 2 | 3 | 4 | public interface LoadDataView { 5 | void showLoading(); 6 | 7 | void showContent(); 8 | 9 | void showError(); 10 | 11 | void showNonet(); 12 | 13 | void showEmpty(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/commen/ViewContainer.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.commen; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.view.View; 6 | import android.view.View.OnClickListener; 7 | import android.view.ViewGroup; 8 | import android.widget.FrameLayout; 9 | 10 | import com.bluemor.mvpdecoupling.R; 11 | import com.bluemor.mvpdecoupling.R.layout; 12 | 13 | import java.util.Collection; 14 | import java.util.HashMap; 15 | 16 | public class ViewContainer { 17 | private final String KEY_CONTENT = "content"; 18 | private final String KEY_NONET = "nonet"; 19 | private final String KEY_ERROR = "error"; 20 | private final String KEY_EMPTY = "empty"; 21 | private final String KEY_LOADING = "loading"; 22 | 23 | private Context context; 24 | private ViewGroup rootView; 25 | private String keyOfShownView; 26 | private OnClickListener onClickListener; 27 | private HashMap viewMap = new HashMap(); 28 | 29 | public ViewContainer(Context mContext, int layout) { 30 | this.context = mContext; 31 | rootView = new FrameLayout(mContext); 32 | 33 | View contentView = View.inflate(context, layout, null); 34 | keyOfShownView = KEY_CONTENT; 35 | viewMap.put(KEY_CONTENT, contentView); 36 | 37 | setNonetView(R.layout.container_nonet); 38 | setErrorView(R.layout.container_error); 39 | setEmptyView(R.layout.container_empty); 40 | setLoadingView(R.layout.container_loading); 41 | } 42 | 43 | public ViewContainer setNonetView(int layout) { 44 | View view = View.inflate(context, layout, null); 45 | viewMap.put(KEY_NONET, view); 46 | return this; 47 | } 48 | 49 | public ViewContainer setErrorView(int layout) { 50 | View view = View.inflate(context, layout, null); 51 | viewMap.put(KEY_ERROR, view); 52 | return this; 53 | } 54 | 55 | public ViewContainer setEmptyView(int layout) { 56 | View view = View.inflate(context, layout, null); 57 | viewMap.put(KEY_EMPTY, view); 58 | return this; 59 | } 60 | 61 | public ViewContainer setLoadingView(int layout) { 62 | View view = View.inflate(context, layout, null); 63 | viewMap.put(KEY_LOADING, view); 64 | return this; 65 | } 66 | 67 | public ViewContainer setDefaultClickListener(OnClickListener onClickListener) { 68 | this.onClickListener = onClickListener; 69 | return this; 70 | } 71 | 72 | public ViewContainer addView(String key, View view) { 73 | viewMap.put(key, view); 74 | return this; 75 | } 76 | 77 | public View build(Object o) { 78 | Collection views = viewMap.values(); 79 | for (View view : views) { 80 | view.setVisibility(View.GONE); 81 | rootView.addView(view); 82 | } 83 | viewMap.get(keyOfShownView).setVisibility(View.VISIBLE); 84 | if (o instanceof Activity) { 85 | ((Activity) o).setContentView(rootView); 86 | } 87 | if (onClickListener != null) { 88 | viewMap.get(KEY_NONET).setOnClickListener(onClickListener); 89 | viewMap.get(KEY_ERROR).setOnClickListener(onClickListener); 90 | viewMap.get(KEY_EMPTY).setOnClickListener(onClickListener); 91 | } 92 | return rootView; 93 | } 94 | 95 | public void showContent() { 96 | show(KEY_CONTENT); 97 | } 98 | 99 | public void showNonet() { 100 | show(KEY_NONET); 101 | } 102 | 103 | public void showError() { 104 | show(KEY_ERROR); 105 | } 106 | 107 | public void showEmpty() { 108 | show(KEY_EMPTY); 109 | } 110 | 111 | public void showLoading() { 112 | show(KEY_LOADING); 113 | } 114 | 115 | public void showView(String key) { 116 | show(key); 117 | } 118 | 119 | private void show(String key) { 120 | View v_shown = viewMap.get(keyOfShownView); 121 | View view = viewMap.get(key); 122 | v_shown.setVisibility(View.GONE); 123 | view.setVisibility(View.VISIBLE); 124 | keyOfShownView = key; 125 | } 126 | 127 | // save this if you need to SaveInstanceState 128 | public String getKeyOfShownView() { 129 | return keyOfShownView; 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/interactor/DoterInfoInteractor.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.interactor; 2 | 3 | public interface DoterInfoInteractor { 4 | public void getDoter(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/interactor/DoterInfoInteractorImpl.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.interactor; 2 | 3 | import com.bluemor.mvpdecoupling.bean.Doter; 4 | import com.bluemor.mvpdecoupling.presenter.DoterInfoCallback; 5 | 6 | import java.util.Random; 7 | 8 | public class DoterInfoInteractorImpl implements DoterInfoInteractor { 9 | 10 | private DoterInfoCallback callback; 11 | 12 | public DoterInfoInteractorImpl(DoterInfoCallback callback) { 13 | this.callback = callback; 14 | } 15 | 16 | @Override 17 | public void getDoter() { 18 | try { 19 | Thread.sleep(1111); 20 | } catch (InterruptedException e) { 21 | e.printStackTrace(); 22 | } 23 | int nextInt = new Random().nextInt(4); 24 | 25 | switch (nextInt) { 26 | case 0: 27 | callback.onResponse(new Doter("BlueMor", "5 years")); 28 | break; 29 | case 1: 30 | callback.onEmpty(); 31 | break; 32 | case 2: 33 | callback.onError(); 34 | break; 35 | case 3: 36 | callback.onNonet(); 37 | break; 38 | } 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/presenter/DoterInfoCallback.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.presenter; 2 | 3 | import com.bluemor.mvpdecoupling.bean.Doter; 4 | import com.bluemor.mvpdecoupling.commen.LoadDataCallback; 5 | 6 | public interface DoterInfoCallback extends LoadDataCallback { 7 | public void onResponse(Doter info); 8 | } 9 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/presenter/DoterInfoPresenter.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.presenter; 2 | 3 | public interface DoterInfoPresenter { 4 | public void loadData(); 5 | 6 | } 7 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/presenter/DoterInfoPresenterImpl.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.presenter; 2 | 3 | import com.bluemor.mvpdecoupling.bean.Doter; 4 | import com.bluemor.mvpdecoupling.interactor.DoterInfoInteractor; 5 | import com.bluemor.mvpdecoupling.interactor.DoterInfoInteractorImpl; 6 | 7 | public class DoterInfoPresenterImpl implements DoterInfoPresenter, DoterInfoCallback { 8 | 9 | private DoterInfoView view; 10 | 11 | private DoterInfoInteractor interactor; 12 | 13 | public DoterInfoPresenterImpl(DoterInfoView view) { 14 | this.view = view; 15 | interactor = new DoterInfoInteractorImpl(this); 16 | } 17 | 18 | @Override 19 | public void loadData() { 20 | view.showLoading(); 21 | interactor.getDoter(); 22 | } 23 | 24 | @Override 25 | public void onResponse(Doter info) { 26 | view.showContent(); 27 | view.showDoterInfo(info); 28 | } 29 | 30 | @Override 31 | public void onError() { 32 | view.showError(); 33 | } 34 | 35 | @Override 36 | public void onNonet() { 37 | view.showNonet(); 38 | } 39 | 40 | @Override 41 | public void onEmpty() { 42 | view.showEmpty(); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/presenter/DoterInfoView.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.presenter; 2 | 3 | import com.bluemor.mvpdecoupling.bean.Doter; 4 | import com.bluemor.mvpdecoupling.commen.LoadDataView; 5 | 6 | public interface DoterInfoView extends LoadDataView { 7 | public void showDoterInfo(Doter info); 8 | } 9 | -------------------------------------------------------------------------------- /src/com/bluemor/mvpdecoupling/ui/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.bluemor.mvpdecoupling.ui; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.view.View.OnClickListener; 7 | import android.widget.TextView; 8 | 9 | import com.bluemor.mvpdecoupling.R; 10 | import com.bluemor.mvpdecoupling.bean.Doter; 11 | import com.bluemor.mvpdecoupling.commen.ViewContainer; 12 | import com.bluemor.mvpdecoupling.presenter.DoterInfoPresenter; 13 | import com.bluemor.mvpdecoupling.presenter.DoterInfoPresenterImpl; 14 | import com.bluemor.mvpdecoupling.presenter.DoterInfoView; 15 | 16 | import org.androidannotations.annotations.AfterViews; 17 | import org.androidannotations.annotations.Background; 18 | import org.androidannotations.annotations.Click; 19 | import org.androidannotations.annotations.EActivity; 20 | import org.androidannotations.annotations.UiThread; 21 | import org.androidannotations.annotations.ViewById; 22 | 23 | @EActivity 24 | public class MainActivity extends Activity implements DoterInfoView { 25 | 26 | private ViewContainer vc; 27 | 28 | private DoterInfoPresenter presenter; 29 | 30 | @ViewById(R.id.tv_info) 31 | TextView tv_info; 32 | 33 | @Override 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | initViewContainer(); 37 | } 38 | 39 | private void initViewContainer() { 40 | vc = new ViewContainer(this, R.layout.activity_main); 41 | vc.setDefaultClickListener(new OnClickListener() { 42 | @Override 43 | public void onClick(View v) { 44 | clickButton(); 45 | } 46 | }); 47 | vc.build(this); 48 | } 49 | 50 | @AfterViews 51 | void initPresenter() { 52 | presenter = new DoterInfoPresenterImpl(this); 53 | } 54 | 55 | @Background 56 | @Click(R.id.bt) 57 | void clickButton() { 58 | presenter.loadData(); 59 | } 60 | 61 | @UiThread 62 | @Override 63 | public void showLoading() { 64 | vc.showLoading(); 65 | } 66 | 67 | @UiThread 68 | @Override 69 | public void showContent() { 70 | vc.showContent(); 71 | } 72 | 73 | @UiThread 74 | @Override 75 | public void showError() { 76 | vc.showError(); 77 | } 78 | 79 | @UiThread 80 | @Override 81 | public void showNonet() { 82 | vc.showNonet(); 83 | } 84 | 85 | @UiThread 86 | @Override 87 | public void showEmpty() { 88 | vc.showEmpty(); 89 | } 90 | 91 | @UiThread 92 | @Override 93 | public void showDoterInfo(Doter info) { 94 | tv_info.setText(info.toString()); 95 | } 96 | } 97 | --------------------------------------------------------------------------------