类微信底部Tab+ViewPager延缓加载实现

效果分析     Android APP采用底部tab切换效果越来越多,像微信,QQ, 支付宝等巨型APP都是采用这种设计。我们今天要介绍的就是基于这样的设计的一种内存优化方案 - ViewPager延迟加载。先看看微信的效果吧。 滑动过程中看到的是正在加载...,等切换完成才会开始加载页面内容。 android ViewPager默认加载当前页面的前一张和后一张,一般情况下会初始化三个界面,先不考虑三个页面同时加载导致的线程网络阻塞的问题,用户打开app并不需要马上初始化不可见的页面,这部分内存是可以优化的,可见的时候才开始加载内容,这样尽量减少内存的占用。 原理分析和实现效果     我们采用ViewPager + FragmentPagerAdapter来实现底部Tag切换的效果,要实现微信这种效果首先需要在不可见时文本占位提示正在加载..., 其次需要获取到当前页面可见与不可见的事件监听。在可见的时候加载内容。这两条都可以通过重写ViewPager来实现,但是比较麻烦,有兴趣的朋友可以去尝试下。我们这里介绍一种更简单的方案,通过重写Fragment的setUserVisibleHint方法来实现。 我们来看看setUserVisibleHint方法官网文档 setUserVisibleHint() Set a hint to the system about whether this fragment's UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore. An app may set this to false to indicate that the fragment's UI

Read more

怎么下载github项目的某个文件夹?

github上提供了git下载和整个项目的zip包下载,有时候项目很大,而你又只想下载某个文件夹的时候就比较麻烦了。整理了下网上的教程如下: 下载master文件夹: 文件夹地址为:https://github.com/alibaba/freeline/tree/master/gradle 本地使用svn checkout  https://github.com/alibaba/freeline/trunk/gradle 就可以了 第一次使用会提示这个 (R)eject, accept (t)emporarily or accept (p)ermanently?  选择p永久接受就好了。 下载Branch文件夹 原理差不多,如文件夹地址为: https://github.com/alibaba/freeline/tree/as_plugin/android-studio-plugin 这是在as_plugin分支下的android-studio-plugin文件夹 svn checkout https://github.com/alibaba/freeline/branches/as_plugin/android-studio-plugin 就可以了 参考:http://www.zhihu.com/question/25369412

Read more

导入intellij plugin项目报错No plugin module specified for configuration

导入intellij IDEA项目总是运行失败,报错No plugin module specified for configuration。 在http://stackoverflow.com/questions/18278440/how-to-import-and-run-existing-plugins-from-intellij-community-edition-repo上找到了答案,原来导入intellij plugin项目默认用的java项目来解析,所以不管怎么设置都添加不了插件项目。 只要把项目根目录的*.iml中MODULE”  改成MODULE”  就可以啦。 还有,别忘了修改plugin.xml的位置,java项目默认在根目录Meta-INF下,而plugin项目在resource下META-INF下。

Read more

java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0

用android studio导入项目的过程中发生了这个错误,gradle classpath用的2.0.111,改成1.5或者2.1就报错extConfig找不到。 网上找了很多答案,答案绝大部分都是说用eclipse设置jre为1.7,但是在android里面我确实已经设置1.8了,在sdk location里面的jdk location。 各种google和stackover找答案,绝望之余居然在百度上找到了解决方案 http://www.she.vc/article/18-98390-0.html 在sdk location里面设置jdk是不够的,还需要修改android studio默认启用的jdk版本。MAC在/Application/Android Studio/Contents/info.plist中 AS默认的是:JVMVersion 1.6*,1.7+ 修改为JVMVersion 1.8.+ 如果修改完报错owner pid 和 my pid不匹配之类的错误,重启android studio就好了。

Read more

android手机调试看不到部分logcat日志

看不到logcat的原因是部分手机默认关闭了Log.v(),Log.d(),Log.i()显示,日志毕竟要输出要文件,对性能还是有影响的,对普通用户而已日志没有任何作用,当然这就苦了开发者了,下面提供部分手机的解决方案,欢迎大家补充。 华为手机解决方案 1、进入手机拨号界面2、输入*#*#2846579#*#*3、输入完毕后自动跳转到测试界面 4、依次选择ProjectMenu–>后台设置–>LOG设置–>在此可以看见一些列关于LOG的设置(打开或关闭) 5. 按照自己的需求设置LOG开关 ### [奇酷手机解决方案](http://bbs.qiku.com/thread-111909-1-1.html) 1、在桌面点击拨号,在拨号盘输入“*20121220#”,进入工程模式;2、找到日志输出等级,点击进入;3、点击“Log print enable”,选择“Enable”; 4、点击“Java log level”,选择“LOGV”;

Read more

让gradle task可以执行多次

在开发中遇到这个需求,google也没能找到答案,最后自己解决了,分享出来给大家参考参考。 默认情况下gradle的task都是只能执行一次的,如下面的代码 task a { println("execute function a !!!!!!!!!!!!!!!!!!"); } a.execute() a.execute() a.execute() 运行后发现task a仅仅执行了一次,为啥只执行一次呢,开始分析通过查看 AbstractTask::execute()方法如下 public final void execute() { this.getExecuter().execute(this, this.state, new DefaultTaskExecutionContext()); this.state.rethrowFailure(); } 通过观察发现是the.state的问题,state的类型是TaskStateInternal,里面记录了task当前的状态,executing正在执行,executed执行完成等等 知道这个状态影响了task多次执行,但是我们还是没有解决我们的问题,再来看看TaskExecuter类,TaskExecuter是一个接口,定义了executing()方法 public interface TaskExecuter { void execute(TaskInternal var1, TaskStateInternal var2, TaskExecutionContext var3); } 再来看看TaskExecuter的实现类有哪些? ExecuteAtMostOnceTaskExecuter引起了我的注意,让task最多执行一次的执行器,看看源码 public class ExecuteAtMostOnceTaskExecuter implements TaskExecuter { private static final Logger LOGGER = Logging.getLogger(ExecuteAtMostOnceTaskExecuter.class); private final TaskExecuter executer; public

Read more

java.lang.IllegalArgumentException: Illegal character (d83d)

在使用XmlSerializer过程中遇到了下面这个错误 java.lang.IllegalArgumentException: Illegal character (d83d) at org.kxml2.io.KXmlSerializer.reportInvalidCharacter(KXmlSerializer.java:144) at org.kxml2.io.KXmlSerializer.writeEscaped(KXmlSerializer.java:130) at org.kxml2.io.KXmlSerializer.attribute(KXmlSerializer.java:465) 这是安卓4.4及以下系统的bug,XmlSerializer类不支持emoji表情,google在android4.4以上已经修复了这个问题 崩溃的具体原因目前不是很清楚,网上说是XmlSerializer忽略utf-16编码情况,具体也不是很了解,等后续再来研究一下。 支持4.4以下解决方案如下 将XmlSerializer serializer = Xml.newSerializer(); 替换成XmlSerializer serializer = new KXmlSerializer(); package com.baidu.hi.xml; import java.io.; import java.util.Locale; import org.xmlpull.v1.; /* * source:https://github.com/cgeo/cgeo/issues/2635 * 解决XmlSerializer在android4.4及以下不支持emoji的bug */ public class KXmlSerializer implements XmlSerializer { private static

Read more

Intellij Idea输出可运行jar包

在开发中经常可以看到可以执行的jar包,如paros.jar,双击运行就可以出现界面,而且是跨平台的,只要安装了jdk的设置都可以运行,那这样的jar包是怎么打包的呢? 这得说起我一个apk重签名的工具,一个利用java awt开发的可视化小工具,想把它打包成一个jar包供其他用户使用,我是用的开发工具是intellij idea,像eclipse不在讨论范围,android studio和这个操作一致。 开始上图了,选择右上角项目菜单 选择Artifaces,然后点击+号添加JAR 选择程序入口Main方法 如果你的项目仅仅只有代码,没有起亚资源文件需要打入包中,那你可以直接Apply,然后ok了,跳过下面添加图片这一步。 我的项目中包括了一张图片,resigner.png,而且在res目录下 我要怎么把图片文件打包到jar文件中呢 创建一个文件夹,名字和你包含图片的文件夹一直,我这里叫res 再在这个res目录中包含进去我们项目中的图片, 选择add cope of 选择File,会弹出提示框让我们选择文件 选择resigner.png图片 然后Apply ok就完成配置了 想打包的话,选择Build -> Build Artifacts就好了 打完的包就可以在out > artifacts 下面找到了。

Read more

解决CollapsingToolbarLayout和ViewPager滚动矛盾

参考文档:https://gist.github.com/iPaulPro/1468510f046cb10c51ea 项目用用到了CollapsingToolbarLayout和ViewPager,ViewPager中又包含一个ListView, 类似上图中效果,但是做完的效果是ListView不能推动CollapsingToolbarLayout滚动,困扰了我好久,解决方案请参考上述链接,我贴出我解决问题用的布局 用到LinearLayout仅仅是为了增加一个分割线 我的效果图

Read more

使用charles抓取https请求

这里就不介绍charles怎么抓取http请求了,相信看这篇文章的读者都是冲着https来的。我也在网上看了很多教程,都说去http://www.charlesproxy.com/ssl.zip下载证书,but这个网址根本访问不了啊,翻墙也访问不了,都是骗纸。最后东拼西凑终于搞定了https的抓取,分享出来给大家。 1.设置charles 在Proxy setting中选择SSL选项,选中Enable SSL proxying,点击Add添加host   * 、 port  443 在help中选择Install Charles CA SSL Certificate 载入证书 都设置好了别忘了重启charles!!! 2.给手机设置证书 下载证书到手机:ssl.zip , 解压后复制到手机,看看手机能不能直接安装charles-proxy-ssl-proxying-certificate.crt 或者浏览器扫描二维码直接下载到手机 (微信,微博不支持下载就不用我说了吧) 不能安装的话看下面的教程: Android的安装证书方法: 先把你的CA证书拷贝到你的SD卡里面 进入手机的“设置”->“位置和安全”,最下面有个“从SD卡安装”,就是安装证书的。点击后按提示操作就OK了 ios的安装证书方法: 通过safari直接下载后安装 通过微信扫描二维码,再通过safari打开链接,会跳转到证书安装界面再下一步 通过邮箱以附件的形式发送到终端设备上,然后打开信任就可以了

Read more