一、 使用 Log 类来输出日志信息 Android SDK中提供了Log类来获取程序运行时的日志信息,该类在android.util包中,它继承了java.lang.Object类。...---- 1.2 Log.e() Log.e()方法主要用来输出ERROR错误日志信息。...---- 2.1 加断点 下面将详细讲解使用 Android Studio 内置的Android调试器调试Android程序的方法,使用该调试器可以设置程序的断点、实现程序的但不执行、在调试过程中查看变量和表达式的值等调试操作...设置断点是程序调试中必不可少的有效手段,和java代码在eclipse中调试一样,Android调试器在每次遇到程序断点的时候,都会将当前线程挂起,也就是说暂停当前程序的运行。...2.6 停止调试 在工具栏中单击停止按钮,即红色的正方形: ,会停止程序的调试。需要注意的是,该操作不回停止程序的运行,而是会跳过所有的调试。
协程作用域 协程的作用域有三种,他们分别是: runBlocking:顶层函数,它和 coroutineScope 不一样,它会阻塞当前线程来等待,所以这个方法在业务中并不适用 。...Google 总是能够解决程序员的痛点,在 Android Jetpack 中的 lifecycle、LiveData 和 ViewModel 已经集成了快速使用协程的方法,如果我们已经引入了 Android...消费数据 collect 方法和 RxJava 中的 subscribe 方法一样,都是用来消费数据的。...,我们很容易得出这样的结论,每个数据都是经过 emit、filter 、map和 collect 这一套完整的处理流程后,下个数据才会开始处理,而不是所有的数据都先统一 emit,完了再统一 filter...接收数据 正常情况下,我们仅需要调用 Channel#receive() 获取数据,但是该方法只能获取一次传递的数据,如果我们仅需获取指定次数的数据,可以这么操作: repeat(4){ Log.e
第一种,手动调用yield方法。...后面一共可以拥有3个 Dispatchers.Unconfined ---默认主线程,事实上却是另外的机制(FIFO,在Android中不用来更新UI) Dispatchers.Default=GlobalScope.launch...---共享的线程池 newSingleThreadContext("MyOwnThread") ---生成新的线程 1.5 生命周期 CoroutineScope by CoroutineScope(...使用 .await()来获取最终数据。...其实两者都是把整个activity视为最大的Coroutine,只需要在onDestroy的时候把最大的cancel,那么内部所有的子Coroutine也会先自行cancel,也就达到了生命周期管理的功能
最近,我打算对我们项目的代码进行清理,准备把一些没有被使用到的公用方法清理掉,但是我在网络找了一遍,像PMD,Findbugs等静态工具,都只能找到没有被使用的私有方法。... public boolean isCallAuth(String str) { return isInculeList(str, callAuths); } /** * 判断一个字符串是否在一个数据列表中...java的所有类型 for (int i = 0; i < lists.length; i++) { if (lists[i].equals(str)) { //包含在列表中...{//是一个目录 //递归执行 getClassList(fileName); } } return this.classList; } /** * 文件中是否包含某个字符串...new ArrayList(); list.add(str); return isIncludeStrs(fullPath, list); } /** * 文件中是否包含了知道的字符串
零、前言:本文源码:GitHub 1.先在视觉上瞄一下进程和线程的区别 2.再从感性上类比一下进程和线程 如果手机是地球,进程就像一家公司,公司使用着地球的资源,也在地球上扮演一个独立的个体,实现自己特有的功能与价值...线程:在操作系统中,线程是CPU调度的最小单元,也是一种有限的系统资源。 进程与线程关系:一个进程可以包含多个线程,因此进程和线程是包含被包含的关系。...zygote64的日志很多,下面只是一小部分。...不清楚Activity启动和View加载过程的小伙伴,可以看一下这个日志,也许会有帮助 比如下面完美呈现了LayoutInflater是怎么运行的,再跟着源码走一走,你会有所收获 然后发现确实是多了两个...4-1:定义接口:ICatService 简单一点,就定义一个喂养的方法 4-2:自动生成的类 类之间的关系基本如下: package com.toly1994.ipc; public interface
在开发过程中,不必编写输出敏感信息的代码,或者在发布之前需要删除所有这些代码。 为了遵循这个规则,首先,不要在操作日志信息中包含敏感信息。...4.8.2.2 构建生成系统,在构建发行版时,自动删除输出开发日志信息的代码(推荐) 开发应用时,有时最好将敏感信息输出到日志中,来检查过程内容和调试,例如复杂逻辑过程中的临时操作结果,程序内部状态信息...4.8.2.3 输出Throwable对象时,使用Log.d()/v()(推荐) 如“4.8.1 示例代码”和“4.8.3.2 日志级别和日志输出方法的选择标准”中所述,输出敏感信息不应通过Log.e(...日志级别和日志输出方法的选择标准 在 Android 中的android.util.Log类中定义了五个日志级别(ERROR,WARN,INFO,DEBUG,VERBOSE)。...表 4.8-1 日志级别和方法的选择标准 日志级别 方法 要输出的日志信息 ERROR Log.e() 应用处于错误状态时,输出的日志信息 WARN Log.w() 应用面临非预期严重情况时,输出的日志信息
在编程世界中,字符串操作是非常常见的任务之一。特别是在Python这样对文本操作友好的语言中,了解如何高效地拼接和格式化字符串是必不可少的。那么,什么是字符串拼接和格式化呢?...简单来说,字符串拼接是把两个或多个字符串连接在一起;而格式化是在一个字符串模板中嵌入变量。在这篇博文中,我们将详细地探讨这两个概念,以及它们在实际开发中的应用。...性能比较 一般来说,f-strings在性能上相对更优,尤其是在涉及多个变量和复杂表达式的情况下。 实际应用场景 日志输出:在企业级应用中,高效的日志输出是必不可少的。...用户界面:在开发Web或桌面应用时,经常需要动态生成用户界面元素,这也会用到字符串拼接和格式化。 总结 掌握不同的字符串拼接和格式化技巧,不仅能让我们的代码更简洁,还能在一定程度上提高程序的性能。...在开发过程中,应根据具体需求选择最合适的方法。 希望这篇文章能帮助大家更深入地理解Python中的字符串拼接和格式化,提高编程效率。如果你有任何问题或想法,欢迎在下方留言。
,例如 xxxDao.java 类的,都会在每一次 build 的时候重新被生成,意味着个人的内嵌修改总是无效,因为总是覆盖你的。...思路参考 在上面的基础上做出如下步骤总结: (看不懂的看下面的符号描述) 创建之前旧表中不存在的新表 创建中间表 & 把旧表的数据迁移到中间表 把旧表全部删除 创建所有新表 把中间表的数据迁移到新表 &...GreenDaoCompatibleUpdateHelper.java 顾名思义,兼容旧表性质的 greenDao 数据库升级,不会造成旧表的数据丢失 拓展了最终的成功和失败的回调 添加了错误日志的处理...,解决方法,不要混淆 dao 文件 restore 步骤中因为新加入的字段含有 int boolean 基础类型,因为不具备默认值而导致出现 SQLiteConstraintException: NOT...1, 答: sqlLite 的源码里面调用 onUpdrade方法的入口皆加上了同步琐,这样不会造成在升级中还能让你去读写的情况。 这点设计得非常优秀!表太多的,几百张?那么就放入子线程升级。
IBookManager.aidl 中添加接口的添加和删除方法。...遍历其数据 或者 获取其大小,我们必须配对使用 beginBroadcast 和 finishBroadcast,参考上面代码中回调的注册和解注册的方法。...所以在知道方法耗时时,我们不能直接在UI线程中调用,需要通过子线程去处理,如示例中客户端 BookManagerActivity 中的 ServiceConnection 的两个方法 onServiceConnected... 2.在服务端的 onTransact 中验证 在 onTransact 中验证失败即返回 false,这样服务端就终止执行AIDL中的方法从而达到保护服务端的效果。...也可以 Uid 和 Pid 来做验证,通过 getCallingUid 和 getCallingPid 可以获取客户端所属应用的 Uid 和 Pid,通过这两个参数我们做 包名验证 等。
toString()) }) 最终打出的日志按顺序是 1,2,3,4,5,a,b,c concatDelayError 和 concatArrayDelayError 是推迟发射 onError。...after the previous one completes....意思大概是说,一旦有观察者订阅了之后,会先将被观察者发射的数据缓存起来,然后将缓存的数据一个接一个的发射出去。 对于外部调用来说,结果和 concat 作用没什么区别。...---- 有重载方法的参数是 ObservableSource> sources 应该和 concat 里用这个参数的重载方法差不多,就不写代码测试了。
认证系统auth auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。auth可以和admin模块配合使用, 快速建立网站的管理系统。...若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。...一般在注册操作中会用到该方法,实现注册一个用户,用到的函数是User.objects.create_user(),在新建用户的时候需要判断用户是否存在,我的实现方式是,User.objects.get(...Permission.objects.get(codename='access_user_manage')是通过权限模型创建,需要在models中创建一个权限类,然后在meta中进行定义codename...在创建好权限之后,下一步就是在各个视图中插入权限控制代码了。permission_required(),参数为当前应用名.codename。
1、需求背景 “不看日志直接提bug都是刷耍流氓!” 我们在日常测试过程中,经常需要去服务器查看日志,测试一个场景可能就涉及到好几个应用,作为测试必须熟悉系统之间的调用关系。...那么出现问题时可能就需要去好几个系统排查问题,需要cd到不同的目录下进行查看,手速快的同事一顿猛敲,手速慢的同事只能干着急了......那么如何快速的查看日志呢?需要一个cdlog命令!...2、需求分析 一般项目的目录结构都是一样的,区别在于应用目录名称以及*.log名称,那么将应用名称提取出来作为脚本参数,脚本来执行cd到log目录下即可; 日志一般分为正常日志、启动日志和error日志...有的,使用alias,也就是别名,详情查看【3、实现方式alias】 3、实现方式alias /etc/profile.d是设置环境变量的,并且对所有用户有效 cd /etc/profile.d &&...fi }; func' 5、最后总结 测试这个工作本身属性就是重复和繁琐,如何提高效率,解决重复和繁琐,就体现了一个测试工程师的价值! 善于挖掘用户痛点不仅是产品经理的工作,也是测试工程师的职责!
由于WebView功能非常强大,目前很多公司的 App 就只使用一个WebView 作为整体框架,App中的所有内容全部使用HTML5进行展示,这样只需要写一次HTML5代码,就可以在多个平台上运行,而不需要更新端侧...WebView只是Android SDK中的一个控件,其本身就像一个与APP隔离开的容器,在WebView中加载的所有页面都运行在这个容器中,无法与APP Java(或者Kotlin)层或者native...如何正确校验白名单 下面我们预设一个场景:该demo APP开发人员小A认为getToken这个方法返回的字符串是一个用户会话标识,属于敏感信息,不应该就这样完全暴露出去,只有白名单中的域名及其子域名才允许调用该方法...校验返回true的时候和调用JavascriptInterface getToken的时候,分别打印一条日志。...所以需要把获取当前URL的方法改一下,从shouldOverrideUrlLoading的第一个参数webview中获取,利用webview.getUrl方法,该方法不会受js代码的影响,改进版如下:
Dagger2 是编译时框架,会在编译时根据你的注解配置生成需要的代码。 ---- 下面是我对 Dagger2 中的常用注解的理解。...创建一个接口,并定义一个方法,定义要往哪里注入;在编译时期 Dagger2 就会自动生成这个接口的实现类 并以 Dagger 开头。...还可以定义 向外提供实例的方法;Dagger2 都会在编译时期生成相应的代码。...这样的也好统一管理维护,Dagger2 会在生成 Component的时候自动实现生成在内定义的方法。...然后在 AppComponent 也加上() 在 Application 中 获取 AppComponent 实例,让其全局唯一。
介绍 在RxJava的事件流转过程中,可以改变事件中的事件以及数据,使用的就是RxJava提供的操作符。...Buffer Concat Replay Merge 而在Operators的文档中图文并茂展示出各个操作符的作用接下来会介绍这些操作符的作用与使用方法 Map Map的作用: 将发射的事件进行Map...过滤其他的ASCII码值,因为a的ASCII是97,通过take获取前面6个元素 调用Observable.zip创建一个合并了nums和chars的发射器,并且通过BiFunction将两个发射器发射的数据进行合并...是根据传入的参数生成顺序数组的方法。...Reduce 如下示例: 每250毫秒发送一个事件 在reduce接收的函数中,每次将发送的事件结果与之前的事件结果相加,并且返回 在subscribe中订阅最终的事件 Observable.interval
代表框架: Hugo(Jake Wharton) SSH SpringMVC Android 中应用 日志 持久化 性能监控 数据校验 缓存 按钮防抖 其他更多 Android AOP就是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术...APT(Annotation Processing Tool 的简称),可以在代码编译期解析注解,并且生成新的 Java 文件,减少手动的代码输入 代表框架: DataBinding Dagger2 ButterKnife...process方法,处理我们自定义的注解,生成代码: public class SingleDelegateProcessor implements IProcessor { @Override public...build/generated/source/apt下可以看到 难点 就apt本身来说没有任何难点可言,难点一在于设计模式和解耦思想的灵活应用,二在与代码生成的繁琐,你可以手动字符串拼接,当然有更高级的玩法用...它可以生成任何源代码供你在任何地方使用,就像剑客的剑,快疾如风,无所不及 Aop和Apt对比 如图所示: ? 和 ?
和 要抛出的异常信息, 我们可以在程序中拿到这两个信息; public void uncaughtException(Thread thread, Throwable ex) (4) 手机设备信息 手机设备信息手机步骤...使用反射获取 Build 类成员变量变量 , 并遍历获取这些变量内容: //获取 Build 中定义的变量, 使用反射方式获取, 该类中定义了设备相关的变量信息 Field[] fields...将之前获取的 Build 设备信息, 版本信息, 崩溃信息转为字符串 : //存储相关的字符串信息 StringBuffer sb = new StringBuffer(); //将成员变量...在 Logcat 中打印崩溃信息 : 之前的默认操作就是打印崩溃信息到 Logcat 中, 我们在这里继续执行完这个步骤, 否则Logcat 中没有数据的; //将 StringBuffer sb...崩溃日志保存到远程服务器 实现途径 : -- 1. 自己开发服务器端 : 在上面的保存文件的基础上, 在开发一个服务器端, 使用网络编程接口将打印到文件的内容上传到服务器端; -- 2.
scRNA-seq最常见的可视化方法是tSNE,tSNE本身可以精确的捕获数据集的局部结构,但是经常会扭曲数据集的全局结构,比如簇与簇之间的距离,本研究开发了一种可视化及解释scRNA-seq数据集的方法...SWNE使用非负矩阵分解方法分解基因表达矩阵到生物学相关的因素中,嵌入细胞、因素信息至二维可视化结果,并使用相似矩阵确保在高维空间中接近的细胞在可视化结果中也相邻/接近。...本研究证明了SWNE能够可视化和促进来自小鼠视觉皮层和小脑的造血前体细胞和神经元细胞的解释。...,虽然一些更新的方法UMAP解决了在数据中捕获全局结构的问题,但是,目前为止尚没有一种方法可以直接将生物信息嵌入到可视化的结果中。...这个框架还能使基因与细胞一起被可视化,为可视化增加生物背景和可解释性。 SWNE比t-SNE表现得更好,在捕捉全局结构方面与UMAP相似,尽管它对局部结构的表示不如t-SNE和UMAP。
酷炫的外部开启Activity新姿势 在H5页面疯狂的今天,H5和Native的交互就至关重要,而且交互的方式有很多,google提供了一个公共的方式:js与native互调,即js可以调用Native...调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多...scheme的使用 使用起来还是非常简单的: 1.在Androidmanifest.xml中定义scheme ...isShowSplash=true&infomation='我是携带的信息'"))); 4.效果展示 让我们看一下打印出来的log日志: ?...和四个等候演示用到的展示的Activity界面。
本篇文章主要是关于ARouter进阶用法拦截器的使用和分析。 拦截器的使用方式 先自定义两个拦截器,看看跳转过程中,拦截器的执行顺序。...执行顺序 在上篇文章中,在分析到ARouter初始化的时候,提到过_ARouter的afterInit()方法,这个方法的作用就是生成一个拦截器的服务对象,然后将所有的拦截器都初始化, 保存在仓库Warehouse.interceptors...---- 4.拦截器的process()方法以及带跳转的回调中的onInterrupt(Postcard postcard)方法,均是在分线程中执行的,如果需要做一些页面的操作显示,必须在主线程中执行。...拦截器执行过程 在跳转的navigation()方法中,会对未设置greenChannel属性所有进行拦截处理。...这里也解释了上面拦截器使用注意事项的第四点,路由跳转传入的回调函数中的onInterrupt()方法是在分线程中执行的。
领取专属 10元无门槛券
手把手带您无忧上云