Mark的私人博客

数风流人物,还看今朝

什么是ANR?

ANR的全称是application not responding,是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。


官方指定的产生ANR一般有以下类型:

1:KeyDispatchTimeout(5秒)–主要类型
按键或触摸事件在特定时间无响应

2:BroadcastTimeout(10秒)
BroadcastReceiver在特定时间无法处理完成

3:ServiceTimeout( 20秒)–小概率类型
服务在特定的时间无法处理完成


导致ANR的根本原因

1.主线程执行了耗时操作,比如数据库操作或网络编程,I/O操作

2.其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。

细分的话,导致ANR的原因有如下几点:
1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.硬件操作(比如camera)
5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
6.service binder的数量达到上限
7.system server中发生WatchDog ANR
8.service忙导致超时无响应
9.其他线程持有锁,导致主线程等待超时
10.其它线程终止或崩溃导致主线程一直等待


调查并解决ANR

  • 1、首先分析log
  • 2、从trace.txt文件查看调用堆栈。-$ adb拉取data / anr / traces.txt。
  • 3、看代码
  • 4、仔细查看ANR的成因(iowait?block?memoryleak?)

如何避免ANR的发生

1.避免在主线程执行耗时操作,所有耗时操作应新开一个子线程完成,然后再在主线程更新UI。

2.BroadcastReceiver要执行耗时操作时应启动一个service,将耗时操作交给service来完成。

3.避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。

被别人问题一愣一愣,骄傲的自己准备好好复习哈!
几乎完全使用这位大佬的


什么是自定义控件?

Android中所有控件和布局的基本类都是View,自定控件就是继承View或者View的派生类,然后重写类中的内部方法。
通常自定义控件分为三种:
1、自定义View:继承View
2、基于现有的组件:继承View的派生类
3、组合的方式:自定义控件中包含了其他组件
下图体现了各种控件的继承关系:

来实践一下组合自定义控件

需要实现的效果如图:

自定义控件实现(二)

问题

遇到一个问题,前段时间由于系统升级之后,做了一下用户群组的改动,在开发的时候发现之前在
.bash_profile中设置的环境变量都不见了,还只能在终端中执行一次source .bash_profile,环境变量才能生效。

解决办法

在系统根目录下,在~/.zshrc文件最后,增加一行:
source ~/.bash_profile

效果就是实现Toast布局自定义,弹出的事件进行控制

一、先自定义布局

1
2
3
4
5
6
7
Toast toast = Toast.makeText(mContext, str, Toast.   LENGTH_SHORT);
View view = LayoutInflater.from(mContext).inflate(R.layout.item_toast, null);
TextView textView = view.findViewById(R.id.str_toast);
textView.setText(str);
toast.setView(view);
toast.setGravity(Gravity.CENTER, 0, 0);
Utils.showTimeToast(toast,500);

二、自定义弹出时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* Toast自定义时间
* Toast对象时间需要为Toast.LENGH_LONG
*/
public static void showTimeToast(final Toast toast, final int time) {
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
toast.show();
}
}, 0, 3000);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
toast.cancel();
timer.cancel();
}
}, time);
}

就是那么简单,利用Timer和schedule实现事件监听,控制toast的弹出时间。

第一部分 背景

1、为什么要开展压力测试?

  • 提高产品的稳定性
  • 提高产品的留存率

    2、什么时候开展压力测试?

  • 首轮功能测试通过后开始
  • 下班后的夜间进行

    第二部分 场景

    手工测试场景

    自动化测试场景

    1、 Monkey
    Monkey 就在手机里,安卓系统再带的

2、 什么是ADB?
Android Debug Bridge 安卓调试桥

阅读全文 »

远程管理命令

关机/重启

序号 命令 对应英文 作用
01 shutdown 选项 时间 shutdown 关机/重新启动
  • shutdown 命令可以安全 关闭重启系统
选项 含义
-r 重新启动

提示:

  • 不指定选项和参数,默认表示 1 分钟后关闭电脑
  • 远程维护服务器时,最好不要关闭系统,而是应该重启系统
1

ssh客户端的简单实用

ssh [-p port] user@remote
如果服务器端没有设置账号密码,或者是无密码登录,直接写ssh -p 22 192.168.177.156ssh -p 228 mark@192.168.177.156

关于ssh配置方法:
ubuntu下默认是不允许root通过密码的方式通过ssh远程登录服务器的,可以通过在

vilink
1
2
3
4
5
6
7
#增加以下配置允许通过ssh登录

#PermitRootLogin prohibit-password
PermitRootLogin yes

#修改完成后需要重启ssh服务命令如下
sudo service ssh restart

即可通过ssh的root用户登录服务器了。
下面说下如何修改root密码

passwd root
1
2
3
4
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
su root #即生效

此时若想验证看root密码是否更改成功,可以通过如下命令

1
2
3
su - root
#在下方输入修改后的密码,输入后回车
Password:

在高德地图集成的时候遇到那玩意。
原文

SHA1获取的几种方式

  • 1、通过Eclipse编译器获取SHA1

使用 adt 22 以上版本,可以在 eclipse 中直接查看。

Windows:依次在 eclipse 中打开 Window -> Preferances -> Android -> Build。

Mac:依次在 eclipse 中打开 Eclipse/ADT->Preferances -> Android -> Build。

在弹出的 Build 对话框中 “SHA1 fingerprint” 中的值即为 Android 签名证书的 Sha1 值

阅读全文 »

android:duplicateParentState指的是当前控件是否跟随父控件的(点击、焦点等)状态

例:假设一Layout有两子View,对Layout进行监听点击事件;子ViewA一个设置duplicateParentState为true,子ViewB设置为false,当点击Layout后,子ViewA的点击态背景变色成功,子ViewB背景态变色无效,因为点击事件被Layout捕获。

阅读全文 »