需求已经测试通过了,手上没有其它事,就看代码,熟悉一些功能和模块,也方便后面快速开发;经过2个版本的优化,通过Bugly看到用户ANR率由我刚来的0.35%降到0.08%, 做的优化总算是见效果了
app调试功能
为了方便app调试一些功能,都会设置一个单独的调试界面,公司app设置的位置就首页的Title
使用注解的方式添加需要调试的功能,可以指定到类
public class DeveloperModel {
@DeveloperActivity.Group(name = "test")
public static void addGroup(DeveloperActivity.GroupItem group) throws Exception {
group.addItem("Codova调试", WebViewActivity.class, null);
group.addItem("注解启动页面", WebViewActivity.class, null);
}
}
public class DeveloperActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_developer);
createData();
}
}
/**
* 反射获取数据
*/
private void createData() {
final List<GroupItem> l = new ArrayList<>();
if (aClass == null) return;
Method[] methods = aClass.getDeclaredMethods();
GroupItem item = null;
for (Method m : methods) {
Group group = m.getAnnotation(Group.class);
try {
item = new GroupItem();
item.name = group == null ? "找不到标题" : group.name();
m.invoke(null, item);
l.add(item);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//指明修饰的注解的生存周期,即会保留到哪个阶段,不加的话运行的时候会获取不到name
@Retention(RetentionPolicy.RUNTIME)
public @interface Group {
String name() default "默认分组";
}
public static class ChildItem {
public String name;
public Intent params;
public Class<? extends Activity> aClass;
public ChildItem(String name, Class<? extends Activity> aClass, Intent params) {
this.name = name;
this.params = params;
this.aClass = aClass;
}
}
public static class GroupItem{
public String name;
public List<ChildItem> childItems = new ArrayList<>();
public List<ChildItem> getChildList() {
return childItems;
}
public ChildItem addItem(String name, Class<? extends Activity> aClass, Intent intent) {
ChildItem childItem = new ChildItem(name, aClass, intent);
childItems.add(childItem);
return childItem;
}
}
BlockingQueue介绍
这几天在看Volley源码,发现使用了两个队列:缓存队列和网络队列,用的是Concurrent包下面的PriorityBlockingQueue类
/** The cache triage queue. */
private final PriorityBlockingQueue<Request<?>> mCacheQueue = new PriorityBlockingQueue<>();
/** The queue of requests that are actually going out to the network. */
private final PriorityBlockingQueue<Request<?>> mNetworkQueue = new PriorityBlockingQueue<>();
BlockingQueue(阻塞队列)可以用来在多线程环境中实现数据共享,所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒
PriorityBlockingQueue继承BlockingQueue类,是一个基于优先级的阻塞,优先级通过Request实现Comparable接口,然后对比getPriority()和mSequence的值来控制
注意的是PriorityBlockingQueue并不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者。因此使用的时候要特别注意,生产者生产数据的速度绝对不能快于消费者消费数据的速度
小结
-
ScrollView添加点击动作
使用OnTouchListener
setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//dosomething
return false;
}
});
-
翻墙
实在受不了打开StackOverFlow太慢了,经同事介绍,开通了一个vpn,再安装了一个Proxy SwitchyOmega插件,来控制哪些web走代理,哪些直接访问,真香配制命令如下
sudo bash go.sh --local ./v2ray-linux-64.zip
sudo gvim /etc/v2ray/config.json
sudo service v2ray restart
- 多渠道打包
项目多渠道打包使用的是gradle-packer-plugin插件
网友评论