对不起,RNG

四年了,逐梦之路未曾离弃。今年是靠近梦最近的一年,但是还是落寞了。我们知道尽力了,但是还是期待一个冠军,期待一句恭喜RNG,恭喜皇族。

或许我再也不会打LOL了,LPL加油,RNG加油。


Android – 内存泄漏

前言

又是一个经常听到的概念,又是一时忍不住想去了解它。内存泄露,即部分对象虽然已经不在使用,但是因为有root持有引用,所以并没有销毁,所占用的内存一直没有被释放。简单的来说就是程序在向系统申请分配内存空间后,在使用完毕后未释放,结果导致一直占据该内存单元。一两次发生影响不大,如果频繁发生,那么可用内存会逐渐不足,最终在某一次请求内存的时候发现内存不足而OOM(内存溢出:程序向系统申请的内存空间超出了系统能给的)。这里要明确一个概念,只有强引用会发生内存泄露,而弱引用因为其特殊机制,所以影响不大。(什么是强弱引用???我也不知道耶,QAQ 逃!先Mark下!下面会讲到。

more >>


非UI线程可以更新UI?

前言

我们都知道,不能在非UI线程中更新UI,但是今天再次接触Handle,实验的时候,发现了一个很奇妙的问题,于是记录一下。

1
2
3
4
5
6
7
8
9
10
11
12
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv_result);
new Thread(){
@Override
public void run() {
mTextView.setText("2333");
}
}.start();
}

你猜猜执行会怎么着?竟然不会Crash,但是以下代码就会Crash。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv_result);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
mTextView.setText("2333");
} catch (InterruptedException e) {
e.printStackTrace();
}
// mTextView.setText("2333");
}
}.start();
}

难道说和线程休眠有关?也不会呀,休不休眠它还是在非UI线程之中呀。那问题出在哪里了呢?

more >>

现实告诉我:

保持好奇心,享受孤独。


Android – 6.0 动态权限

前言

很早就知道Android 6.0新功能动态权限申请,但是一直没接触过,因为特殊权限也没怎么用过。但是最近看到好多文章阐述,一时技痒,就搞搞看。做过之后才知道,掌握这个知识点还是很有必要的,因为在Android 6.0 以上的设备上,一些特殊权限必须是在运行时动态赋予给用户的。如果直接Intent跳转的话,应用直接Crash了。

申请步骤

  • targetSdkVersion >= 32
  • AndroidManifest.xml中申请需要的权限,包括普通权限和特殊权限
  • 开始动态申请权限

​ (1):检查是否有此权限 ContextCompat.checkSelfPermission(),返回整形,和PackageManager.PERMISSION_GRANTED对比,相等则说明有此权限,如果有此权限,完全OK

​ (2):没有此权限,则判断是否需要向用户解释为何申请权限 shouldShowRequestPermissionRationale() ,然后通过ActivityCompat.requestPermissions()方法申请权限,该方法有三个参数,即当前Activity,要申请的权限(字符串数组),requestCode。这样就可以知道一次可以申请多个权限,而requestCode就是用来在第三部回调的时候判断是谁申请了权限。

​ (3):在当前Activity中的onRequestPermissionsResult()方法中处理用户是否授予了此权限。

  1. 在小米5上测试的时候,发现当用户拒绝了权限,之后在点击就不会在弹出提示框,而在原生的Android系统中,拒绝一次之后再次点击,第二次弹出申请权限的对话框中会出现”以后不再弹出“的复选框。参考网上一个比较好的做法是,在再次点击的时候打开当前应用的信息界面,让用户可以手动来赋予权限。代码如下:
1
2
3
4
5
6
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
String pkg = "com.android.settings";
String cls = "com.android.settings.applications.InstalledAppDetails";
intent.setComponent(new ComponentName(pkg, cls));
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
  1. 测试了两个权限,一个是打开相册权限,一个是拨打电话权限,在点击提示框赋予权限之后,可以直接跳转的系统相册界面,但是在赋予通话权限之后,还需要再次点击才能进去通话界面,主要是通电话的Intent不能写入到onRequestPermissionsResult()方法中,提示“ Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or explicitly handle a potential SecurityException “,这不是开玩笑吗?留个坑吧,待解决。

Demo 地址:

https://github.com/Omooo/DynPermissionsDemo

参考

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1110/3670.html

http://www.jianshu.com/p/a51593817825

http://www.cnblogs.com/dubo-/p/6018262.html

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?