Android

共计 36 篇文章

Android Handler使用

在Android开发的过程中,经常会有这样的场景:从网络获取数据然后更改某个控件的属性。例如,从网络API获取Json,解析某个字段的值,将它设定到对应的TextView中。在很多人刚开始入门Android的时候,可能会将网络请求解析和设定TextView放在一起处理。当然这样是不行的。为什么呢?这个就需要引入线程和进程的概念。 进程和线程 说到进程,其实是需要大致了解一些计算机的CPU原理的。CPU是一台电脑的处理核心,假设现在的CPU是单核的,所有的任务处理都是需要通过它来进行的。它通过时间将任务分成一个又一个的时间片进行处理。对我们用户来看,好像上网、听歌、处理Word好像是一直都在运行。但对于CPU来说,它可能处理了一会上网的任务,又处理了一会听歌的任务,然后又处理了一下Word的任务。因为CPU速度很快,现在操作系统也有很好的调度策略。导致对于我们用户来说,好像任何的任务都是连续不间断的。上面所说的上网、听歌、

智能电视Root并删除预装

自从不怎么玩Xbox了之后,一直都没有怎么用过电视,基本上大的需求就是把NAS里面的电影有的时候在电视上面放着看看。每次开机都被我家这个海信智能电视的广告恶心到了。说好的智能也就是在Android系统开机之前放一个15~30s不等的广告。 想一想,既然都是Android系统了,那么就很简单了,Root后我找到对应的预装软件删除了就好了。 环境信息 智能电视:海信K370 工具:一台电脑,一个外接USB键盘 前提:保证电脑中ADB已经配置好了,同时电脑和电视在一个局域网 开始 打开电视的ADB调试模式 这里面每个品牌的智能电视都不一样,像海信不同型号的方式也不同。具体的大家可以自行电视型号+工厂模式就可以搜出来。我的这台电视机,需要在**「设置-声音-声音平衡」的这个选项中,通过外接键盘输入1969**,此时屏幕右上角就会出来一个黄色背景的M,按遥控器的菜单键,就可以呼出工厂模式的菜单了。

RcyclerView DataBinding结合

最近在将自己之前的项目从MVP更改到MVVM,遇到了一些坑,也学习了不少。记录下自己怎么去解决RcyclerView和DataBinding结合的过程。本文的前提是假设你有一部分的MVVM的基础,并且知道如何是用DataBinding。 重点 先说重点,RcyclerView和DataBinding结合最重要的其实就两个方法: onCreateViewHolder()中ViewHolder获取了对View的引用,方便快速的处理数据 onBindViewHolder()中将指定的数据传送给View 实现 为了达到通用的目的,我创建了一个基础的Adapter。按照上面说的两个重要方法。我们看看如何实现: onCreateViewHolder() @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { B binding = DataBindingUtil.inflate(

Retrofit添加User-Agent信息

最近这两天遇到一个问题,找到了一个公有的开放的API,但是通过Retrofit默认请求得到的结果是code = 400, message = Bad Request。看别人写的用Volley,完全没有问题。 添加Headers 开始我以为是头文件信息不对导致的。在ApiServer里面添加了注释 @Headers({ "Content-Type: application/json; charset=utf-8", "Accept: application/json" }) @GET("xxxxx") Call<ResponseBody>

Android签名信息获取

由于接手一个二次项目,需要更改一下之前的签名信息,但是发现签名信息修改之后,程序中出了很多问题,跟踪了下,发现是接入第三方平台服务过程中,签名信息不一致导致的。 可以在命令行中输入 keytool -v -list -keystore yourkeystore 之后会有这么一串信息输出 别名: test 创建日期: 2017-11-13 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: 发布者: 序列号: 有效期开始日期: Mon Nov 13 16:57:

更新AS导致界面预览失效

今天在更新自己笔记本的AS时候,遇到了一个问题。首先打开Layout文件,没法预览布局。 按照网上说的,我将我自己的SDK版本做了勾选,仍然无法使用。 使用了无数次的Restart and invalidate caches 仍然没有效果。反倒Run 那一栏全部灰掉。找寻了很久没有找到很好的解决方案。 看到Log输出的结果是这样: Write access is allowed from event dispatch thread only 顺着这个思路,看到了SOF上面有一个开发者提供了一个解决方案,试了试。成功。 原因就是在AS 3.0RC 版本升级到AS

同时安装Release和Debug版本

在开发的过程中,由于经常切换开发环境和线上环境,对应的开发出来的包也是Debug和Release两个版本。由于Android只允许一台手机安装包名唯一的APP,所以难免在切换环境的时候,来回的删除再安装。 原理 为了想解决这个问题,昨天我着手将自己的APP配置了下,已经完美可以实现两个版本共存了。用到的,其实是Gradle的灵活性。 既然上面已经说了,Android系统默认只能安装一个包名相同的APP,那要想同时安装两个APP,所要做的操作就很简单了。让Debug和Release产生出不一样的包名就可以搞定。 实现 顺着这个思路,我们只需要利用Gradle的特性就可以完成。在默认的情况,我们是可以通过Gradle配置来实现分版本打包签名。 `android{ signingConfigs { debug { } release { storeFile file(“x.keystore") storePassword “x”

Gradle配置打包文件名

前段时间从AS 2.4到AS 3.0 Beta版本的时候,由于Gradle升级了,导致我原有的文件配置代码没法正常的使用。这两天又遇到这个问题了。所以记录一下。 以前应该都是这么写的: applicationVariants.all { variant -\> variant.outputs.all { output -\> def outputFile = output.outputFile if (outputFile != null && outputFile.name.

关于Toolbar的Back返回问题

昨天在引入Toolbar的时候,出现了一个问题。就是按Toolbar上面的back按钮没有反应。实际上点击时间是发生的,因为产生了动画。 同样另一个Activity,也是用了同样设置方法,确是可行的,我觉得很奇怪,看了看两者的区别,初始化的时候代码都一样 setSupportActionBar(mToolbar); getSupportActionBar.setDisplayHomeAsUpEnabled(true); 找来找去,都觉得很奇怪,去SOF搜了下,这里有一个解答。 其实一下子转眼一想,也就明白了为什么会这样。Toolbar上的按钮「无论是自定义的还是系统实现的」实际上都是需要在**onOptionItemSelected(MenuItem item)**中来处理选择后的逻辑。因此,这里需要将Toolbar中的back事件处理下。即 @Override

ButterKnife in BaseActivity and BaseFragment

在日常的开发中,我们经常会遇到这样的场景,几个比较特定的功能或者重复的代码在Activity/Fragment中,我们一般采取的措施就是抽离出来去做一个基类,然后通过子类继承父类的方式来实现。 对于用过ButterKnife的朋友来说,应该已经体会到BF的便捷性和优点。所以理所当然,我们需要把BF放到BaseClass中,节省书写重复代码。 但正如这个issue中JakeWharton说的那样: Gotcha. Butter Knife is not magical and is actually a very boring, stupid, and predicable library. If you call Butter Knife