尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成。

项目地址

接近完成的时候,想在天气信息页面实现一个很常见的功能,也就是点击屏幕下方的返回键的时候不是返回到上一个activity或者退出,而是提醒用户再按一次就会退出。

实现思路也很简单,就是对返回键的动作进行监听和拦截,然后重写成需要的动作,因为在我的程序中activity只作为调度器使用,真正的View功能在fragment中,所以返回键的动作捕捉只能以接口形式

BaseFragment实现这个接口,代码如下:

   public class BaseActivity extends AppCompatActivity {
protected final String TAG = this.getClass().getSimpleName(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
} @Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
} //返回键监听实现
interface FragmentBackListener {
void onBackForward();
} private FragmentBackListener backListener;
private boolean isInterception = false; public void setBackListener(FragmentBackListener backListener) {
this.backListener = backListener;
}
//是否拦截
public boolean isInterception() {
return isInterception;
} public void setInterception(boolean isInterception) {
this.isInterception = isInterception;
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (isInterception()) {
if (backListener != null) {
backListener.onBackForward();
return false;
}
}
}
return super.onKeyDown(keyCode, event);
}
}
public abstract class BaseFragment extends Fragment implements BaseActivity.FragmentBackListener {
protected Disposable disposable;
protected final String TAG = this.getClass().getSimpleName();
//返回键点击间隔时间计算
private long exitTime = ; //捕捉返回键点击动作
@Override
public void onBackForward() {
//和上次点击返回键的时间间隔
long intervalTime = System.currentTimeMillis() - exitTime;
if (intervalTime > ) {
Toast.makeText(getActivity(), getString(R.string.exit_toast), Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
ActivityCollector.finishAll();
}
} @Override
public void onAttach(Context context) {
super.onAttach(context);
//注册监听
((BaseActivity) getActivity()).setBackListener(this);
((BaseActivity) getActivity()).setInterception(true);
} @Override
public void onDetach() {
super.onDetach();
//取消监听
((BaseActivity) getActivity()).setBackListener(null);
((BaseActivity) getActivity()).setInterception(false);
} @Override
public void onDestroyView() {
super.onDestroyView();
unsubscribe();
} protected void unsubscribe() {
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
} }

通过一个ActivityCollector来管理活动:

public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity) {
activities.add(activity);
} public static void removeActivity(Activity activity) {
activities.remove(activity);
} public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}

这样,所有继承BaseFragment的fragment都回拥有这个单击提醒 双击退出的功能了,代码不复杂,也带有注释,相信很容易看懂。

如果某个页面不需要这个功能可以在fragment中重写BaseFragment中的onAttach方法

@Override
public void onAttach(Context context) {
super.onAttach(context);
((BaseActivity) getActivity()).setInterception(false);
}

当然如果手机应用的大多数页面不需要这个功能,可以在BaseFragment中默认关闭拦截,在需要用的fragment中重写onAttach来打开。

最后说一点我在开发过程中遇到的小坑,在网络访问的功能方面我使用了squareup的retrofit2和okhttp

一开始我在build.gradle是这么配置的

    //squareup dependencies
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.squareup.retrofit2:converter-scalars:2.2.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0' //RxJava dependencies
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.2'

但是编译的时候无法通过,

经过排查,原因是retrofit2自带的rxjava适配器还未升级到rxjava2,所以产生了编译错误,解决办法也不复杂Jake大神给我写了一个rxjava2的适配器,替换原来的就可以了:

    //squareup dependencies
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0' //gson转化器
compile 'com.squareup.retrofit2:converter-scalars:2.2.0'//String转化器
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' //RxJava dependencies
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.2'

最新文章

  1. How to change owner of PostgreSql database?
  2. iOS开发——高级技术&amp;内购服务
  3. 编程实现LINUX下目录的层层遍历
  4. How Tomcat Works(七)
  5. js查看浏览器类型和版本
  6. Java最重要的21个技术点和知识点
  7. RabbitMQ 原文译1.1--HelloWord
  8. C# 客户端判断是否安装office03、07或WPS
  9. c++使用mysql的api连接相关问题
  10. Java 获取字符串中第N次出现的字符位置
  11. 【Linux】鸟哥的Linux私房菜基础学习篇整理(六)
  12. 获取X天后的日期
  13. 抓包分析、多线程爬虫及xpath学习
  14. A1108. Finding Average
  15. nginx多虚拟主机优先级location匹配规则及tryfiles的使用
  16. [C语言]进阶|指针与字符串
  17. 机器学习--详解人脸对齐算法SDM-LBF
  18. 【android】环形进度条实现
  19. 在Eclipes中查看源代码和大纲快速定位
  20. NFS详解

热门文章

  1. noip模拟赛 小Y的问题
  2. codeforces gym 100357 K (表达式 模拟)
  3. 洛谷—— P1825 [USACO11OPEN]玉米田迷宫Corn Maze
  4. - &gt; 贪心基础入门讲解三——活动安排问题二
  5. 通用的Adapter
  6. J2EE肌肉系统—四层模型
  7. Chrome 消息机制
  8. MySQL create table as与create table like对照
  9. Java原型模式之浅拷贝-深拷贝
  10. Ubuntu下用命令行快速打开各类型文件(转)