老样子,直接贴代码!!!
需要导入Retrofit+Rxjava和ButterKnife。至于一些工具类之前在博客中写过,拷贝即可。
首先是BaseActivity:
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity { public App application; public Handler mHandler; public Toast toast; protected P mPresenter; private Thread.UncaughtExceptionHandler sUncaughtExceptionHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化布局,并且适配 View view = View.inflate(this, getLayout(), null); AutoUtils.setSize(this, false, 720, 1280); AutoUtils.auto(view); setContentView(view); //禁止横屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //禁止键盘挤压布局 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); ButterKnife.bind(this); mHandler = new myhandle(this); application = App.getApp(); toast = new Toast(this); if (onCreatePresenter() != null) { mPresenter = onCreatePresenter(); } App.getApp().addActivity(this); initData(); //上线前解开 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { //主线程异常拦截 while (true) { try { Looper.loop();//主线程的异常会从这里抛出 } catch (Throwable e) { } } } }); sUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); //所有线程异常拦截,由于主线程的异常都被我们catch住了,所以下面的代码拦截到的都是子线程的异常 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { } }); } //加载布局 public abstract int getLayout(); //加载数据 public abstract void initData(); public static class myhandle extends Handler { //使用弱引用防止内存泄漏 WeakReference<BaseActivity> activityWeakReference; public myhandle(BaseActivity activityWeakReference) { this.activityWeakReference = new WeakReference<BaseActivity>(activityWeakReference); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (activityWeakReference.get() != null) { activityWeakReference.get().handlerMeaasg(msg); } } } public static int MIN_DELAY_TIME = 1000; // 两次点击间隔不能少于1000ms private static long lastClickTime; public static boolean isFastClick() { boolean flag = true; long currentClickTime = System.currentTimeMillis(); if ((currentClickTime - lastClickTime) >= MIN_DELAY_TIME) { flag = false; } lastClickTime = currentClickTime; return flag; } //子类可以同时重写这个方法实现Handler传输 public void handlerMeaasg(Message msg) { } // 内存紧张时回收图片资源 @Override public void onLowMemory() { super.onLowMemory(); Glide.get(this).clearMemory(); } // 内存紧张时回收图片资源 API4.0 @Override public void onTrimMemory(int level) { super.onTrimMemory(level); Glide.get(this).trimMemory(level); } //Acitiy销毁时反注册插件,并且移除活动 @Override protected void onDestroy() { application.removeActivity(this); ButterKnife.unbind(this); if (mPresenter != null) { mPresenter.unSubscribe(); } super.onDestroy(); } public void showToast(String msg) { if (toast != null) { toast.cancel(); } toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } private ProgressDialog dialog; public void showLoading() { if (dialog != null && dialog.isShowing()) { return; } dialog = new ProgressDialog(this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCanceledOnTouchOutside(false); dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage(getString(R.string.loading)); dialog.show(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 10) { dismissLoading(); } } }; public void dismissLoading() { if (dialog != null && dialog.isShowing()) { dialog.dismiss(); } } //输入框下划线效果 public void lineSelector(EditText[] etArray, final TextView[] tvArray) { for (int i = 0; i < etArray.length; i++) { final int position = i; etArray[i].setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { //此处为得到焦点时 tvArray[position].setEnabled(true); } else { //此处为失去焦点时 tvArray[position].setEnabled(false); } } }); } } protected abstract P onCreatePresenter(); /** * 清楚webview 缓存 * * @param wv webview */ public static void WebViewClearUtils(WebView wv) { wv.setWebChromeClient(null); wv.setWebViewClient(null); wv.getSettings().setJavaScriptEnabled(false); wv.clearCache(true); } }
可以发现BasePresenter还没有:
public class BasePresenter<V extends BaseView, M extends BaseModel> { protected V mView; protected M mModel; private CompositeSubscription mCompositeSubscription; /** * 添加订阅者 * * @param subscription */ protected void addSubscribe(Subscription subscription) { if (mCompositeSubscription == null) { mCompositeSubscription = new CompositeSubscription(); } mCompositeSubscription.add(subscription); } /** * 移除订阅者,防止内存泄漏 */ protected void unSubscribe() { if (mView != null) { mView = null; } if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { mCompositeSubscription.clear(); } } }
还少两个BaseView和BaseModel:
public interface BaseView { }
public interface BaseModel { } 完事了,拷贝即可使用,下一篇写一下使用Mvp加Retrofit+Rxjava实现的网络请求