RxBinding用来处理安卓UI响应,沿用了RxJava(android)的风格,可以切换线程和变形,让代码可读性提高。上代码:
1、RxActivity
package com.example.test.activity;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;
import com.example.test.R;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
import java.util.concurrent.TimeUnit;
import rx.functions.Action1;
/**
* @authore WinterFellSo 2017/3/22
* @purpose Rx系列库,RxJava(Android)、RxBingding
*/
public class RxActivity extends BaseActivity {
private Button throttleFirst;
private Button showColor;
private CheckBox checkBoxChange;
@Override
protected int getContentLayout() {
return R.layout.activity_rx;
}
@Override
protected void initGui() {
throttleFirst = (Button) findViewById(R.id.throttleFirst);
showColor = (Button) findViewById(R.id.showColor);
checkBoxChange = (CheckBox) findViewById(R.id.checkBoxChange);
}
@Override
protected void initAction() {
//两秒钟之内只取一个点击事件,防抖操作
RxView.clicks(throttleFirst)
.throttleFirst(2, TimeUnit.SECONDS)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(RxActivity.this, "点击", Toast.LENGTH_SHORT).show();
}
});
//监听长按时间
RxView.longClicks(throttleFirst)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(RxActivity.this, "长按", Toast.LENGTH_SHORT).show();
}
});
//复选框监听
RxCompoundButton.checkedChanges(checkBoxChange)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
showColor.setEnabled(aBoolean);
showColor.setBackgroundResource(aBoolean ? android.R.color.holo_red_light : android.R.color.holo_blue_bright);
}
});
}
@Override
protected void initData() {
}
}
subscribe方法(RxJava具有的)就是订阅(RxJava用到的是观察者模式,被观察者与观察者通过订阅来建立联系),当建立联系的时候会自动调用call方法
2、BaseActivitypackage com.example.test.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.widget.ListView;
import com.example.test.R;
import com.example.test.application.BaseApplication;
import com.example.test.data.ActivityTack;
import com.example.test.data.DataCenter;
/**
* @authore WiActivitynterFellSo 2017/3/22
* @purpose 基础
*/
public abstract class BaseActivity extends Activity{
protected Activity ctx;
protected BaseApplication app;
private long lastClickTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();
// 取消标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 设置全屏
// window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 高亮
// window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// 添加到activity stack管理集合
ActivityTack.getInstanse().addActivity(this);
ctx = this;
app = (BaseApplication) getApplication();
app.setContext(ctx);
if (getContentLayout() != 0) {
setContentView(getContentLayout());
}
initGui();
initAction();
initData();
}
/**
*
* @Title: isFastDoubleClick
* @Description: 判断事件出发时间间隔是否超过预定值
* @param @return
* @return boolean
* @throws
*/
public boolean isFastDoubleClick() {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (0 < timeD && timeD < 1000) {
return true;
}
lastClickTime = time;
return false;
}
public void startActivity(Intent intent) {
// 防止连续点击
if (isFastDoubleClick()) {
return;
}
super.startActivity(intent);
}
protected abstract int getContentLayout();
protected abstract void initGui();
protected abstract void initAction();
protected abstract void initData();
//完全退出
public void exit(){
ActivityTack.getInstanse().exit();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
ActivityTack.getInstanse().removeActivity(this);
super.onDestroy();
}
@Override
public void onResume() {
super.onResume();
}
}
每个Activity都会集成虚类BaseActivity;每个activity创建时候,都会加入到一个全局列表当中。android完全退出:
第一种,退出时候,线性表清空且每个activity都会调用finish();
第二种:清空线性表,且杀进程
// 结束进程
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
3、ActivityTack
package com.example.test.data;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import com.example.test.activity.BaseActivity;
public class ActivityTack {
public List<Activity> activityList = new ArrayList<Activity>();
public static ActivityTack tack = new ActivityTack();
public static ActivityTack getInstanse() {
return tack;
}
private ActivityTack() {
}
public BaseActivity getBaseActivity() {
if (activityList != null && activityList.size() > 0) {
return (BaseActivity) activityList.get(activityList.size() - 1);
}
return null;
}
public void addActivity(Activity activity) {
activityList.add(activity);
}
public void removeActivity(Activity activity) {
if (activity != null) {
activityList.remove(activity);
activity.finish();
activity = null;
}
}
public void removeAllActivity() {
while (activityList.size() > 0) {
popActivity(activityList.get(activityList.size() - 1));
}
}
/**
* 完全退出
*
* @param context
*/
public void exit() {
while (activityList.size() > 0) {
popActivity(activityList.get(activityList.size() - 1));
}
// 结束进程
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
/**
* 根据class name获取activity
*
* @param name
* @return
*/
public Activity getActivityByClassName(String name) {
for (Activity ac : activityList) {
if (ac.getClass().getName().indexOf(name) >= 0) {
return ac;
}
}
return null;
}
public Activity getActivityByClass(Class cs) {
for (Activity ac : activityList) {
if (ac.getClass().equals(cs)) {
return ac;
}
}
return null;
}
/**
* 弹出activity
*
* @param activity
*/
public void popActivity(Activity activity) {
removeActivity(activity);
activity.finish();
activity = null;
}
/**
* 弹出activity到
*
* @param cs
*/
@SuppressWarnings("rawtypes")
public void popUntilActivity(Class... cs) {
List<Activity> list = new ArrayList<Activity>();
for (int i = activityList.size() - 1; i >= 0; i--) {
Activity ac = activityList.get(i);
boolean isTop = false;
for (int j = 0; j < cs.length; j++) {
if (ac.getClass().equals(cs[j])) {
isTop = true;
break;
}
}
if (!isTop) {
list.add(ac);
} else
break;
}
for (Iterator<Activity> iterator = list.iterator(); iterator.hasNext();) {
Activity activity = iterator.next();
popActivity(activity);
}
}
}
如果要读懂RxBinding,应该先去了解RxJava,推荐可以看这篇博客文(需要有点耐心)
RxBinding的git地址(android studio引入库)
RxJava&RxJava Android&RxBinding所有类库,可以从下面地址下载