什么样的人很可怕?

今天下雨了。

什么样的人很可怕呢?嗯,我可能会想到,哇,这个人智商高的可怕。但是,曾经在知乎上看到一个回答,说的是有勇气毅力的人很可怕,冷静分析,好像的确是这样。

如果努力坚持做一件事,你觉得你的胜算是多少呢?你肯定会说,嗯,肯定会成功啦。那么问题来了,你明明知道会是很好的结果,为什么不选择去尝试坚持呢?

我,,,我,坚持不住。是的,很多时候,我们做事都会半途而废,更可怜的是那些还不敢于尝试的人。

快要毕业了,是不是应该约束一下自己了呢?把计划都刻在脑海里,不要轻易说出来。

本来要去跑步的,于是有了这篇博客。

感觉以后也会很少写博客了,欢迎关注我的Github。


Android — layout_weight 解析

前言

  1. LinerLayout可以为其包含的控件指定填充权值layout_weight。这样就允许其包含的控件可以填充屏幕上的剩余控件,避免了所有控件挤成一堆的情况,剩余的空间会按这些控件的权值比例分配屏幕。
  2. 默认情况下,weight的值为0,表示按控件的实际大小显示;如果weight值设置高于0,剩余空间会按控件的weight值所占所有控件weight的比例分配给该控件。比如有两个控件,一个weight值为1,另一个为2,则剩余空间会把1/3的部分给控件一,剩下的2/3分配给控件二,也就是说权值越大,重要度越高。
  3. 如果LinerLayout包含子LinerLayout,子LinerLayout之间的权值越大,重要程度越小。如果有LinerLayout A包含LinerLayout C D,C权值为1,D权值为2,则屏幕的2/3会分配给C,1/3分给D。在LinerLayout嵌套的情况下,子LinerLayout必须要设置权值,否则默认情况下是未设置权值的子LinerLayout占据整个屏幕。

下面我们来测试一下,并讲解一个通用的计算方法。

more >>


Android — BaseAdapter 的使用以及优化

前言

BaseAdapter数据适配器,连接数据源与视图界面的桥梁。BaseAdapter是一个抽象类,使用BaseAdapter必须写一个类继承它,并且实现它的四个方法。首先我们应该清楚流程,当系统绘制ListView的时候,首先调用getCount()方法,获取ListView的长度,然后再调用getView()方法,根据这个长度逐一绘制ListView的每一行。也就是说,如果getCount返回1,那么就只显示一行。而getItem()和getItemId()则需要处理和取得Adapter中的数据时调用。而数据量很大的时候就需要绘制很多行,极大的消耗资源,导致ListView滑动非常慢,那应该怎么优化呢?本节我们搭配ListView使用BaseAdapter,并逐渐来优化BaseAdapter。

more >>


Android — AsyncTask 异步加载

前言

我们知道,当Android程序启动的时候,会同时启动一个对应的主线程 (Main Thread),这个线程主要负责处理与UI相关的事件,我们也叫它UI线程。而Android UI操作并不是线程安全的并且这些操作都要在UI线程中执行。还有就是像一些耗时操作如网络操作不能在主线程中进行,一旦时间超过五秒,就会报ANR(应用程序无响应)异常。那么问题来了,如果我们要在非UI线程中操作UI该怎么做呢?这里就需要引入异步任务了,当然实现异步任务也不只是可以使用AsyncTask,这里我们先讲讲AsyncTask这个官方给我们封装好的轻量级异步类。

基本结构

AsyncTask是一个抽象类,一般我们会定义一个类继承至AsyncTask,然后重写相关的方法。

AsyncTask 包含三个泛型参数:(不需要返回类型写 Void 即可)

Params : 启动任务时输入的参数类型。

Progress : 后台任务执行返回进度值得类型。

Result : 后台任务执行完成后返回结果的类型。

more >>


Android — Activity详解

前言

Activity作为四大组件之一,简单来说就是用来处理与用户交互的。本节我们简单讲解一下Activity的生命周期、任务栈以及数据传递,刚刚接触安卓,大佬轻拍。

Activity生命周期

onCreat() —> onStart() —> onResume() —> onPause() —> onStop() —> onDestroy() 完整的生命周期。

onResume()会使当前Activity获得焦点,当调用onPause()时,当前还是可见的,但失去焦点了,在调用onStop()后,该Activity已经变得不可见了。这时候可以调用onRestart()重新回到前台。

Activity任务栈

一个APP都是由多个Activity构成的,而在Android中给我提供了一个Task (任务)的概念,而在Android中实现了Task的数据结构就是Bask Stack (回退堆栈),也就是后进先出。官方文档给出的流程图:

总结:

Task是Activity的集合,是一个概念,实际上是使用Back Stack来存储Activity,可以有多个Task,但是同一时刻只有一个栈在最前面,其他的都在后台。那么栈是如何产生的呢?

答:当我们新打开一个APP,此时会创建一个的Task。举个例子:我们通过点击通信录APP的图标打开APP,这个时候会新建一个栈1,然后开始把新产生的Activity添加进来,可能我们在通讯录的APP中打开了短信APP的页面,但是此时不会新建一个栈,而是继续添加到栈1中,这是 Android推崇一种用户体验方式,即不同应用程序之间的切换能使用户感觉就像是同一个应用程序, 很连贯的用户体验,官方称其为seamless (无缝衔接)! ——————这个时候假如我们点击Home键,回到主屏幕,此时栈1进入后台,我们可能有下述两种操作:
1)点击菜单键(正方形那个按钮),点击打开刚刚的程序,然后栈1又回到前台了! 又或者我们点击主屏幕上通信录的图标,打开APP,此时也不会创建新的栈,栈1回到前台!
2)如果此时我们点击另一个图标打开一个新的APP,那么此时则会创建一个新的栈2,栈2就会到前台, 而栈1继续呆在后台;
3) 后面也是这样…以此类推!

Activity数据传递

  1. 简单的数据传递(单个数据和多个数据的传递)

保存数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
String text = mEditText1.getText().toString().trim();
String sex="";
// //单个数据传递
// if (mRadioButton1.isChecked()) {
// sex = mRadioButton1.getText().toString();
// }
// Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
// Log.i("2333", text);
// intent.putExtra("key", text);
// intent.putExtra("sex", sex);
// startActivity(intent);
//多个数据传递
for (int i = 0; i < mRadioGroup1.getChildCount(); i++) {
RadioButton rb = (RadioButton) mRadioGroup1.getChildAt(i);
if (rb.isChecked()) {
sex = rb.getText().toString();
break;
}
}
Bundle bundle = new Bundle();
bundle.putString("username", text);
bundle.putInt("age", 18);
bundle.putString("sex", sex);
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);

获取数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
mTextView1 = findViewById(R.id.textView2);
//获取单个数据
// Intent intent = getIntent();
// String username = intent.getStringExtra("key").toString();
// String sex = intent.getStringExtra("sex").toString();
// mTextView1.setText(username+sex);
//获取数据集
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String username = bundle.getString("username").toString();
String sex = bundle.getString("sex").toString();
int age = bundle.getInt("age");
mTextView1.setText(username+sex+age);
  1. 多个Activity之间的数据传递(后一个Activity回传给前一个Activity)

在第一个Activity中启动第二个Activity的时候不用startActivity()方法了,改用startActivityForResult()方法。然后在第一个Activity中重写回调方法onActivityResult。然后在第二个Activity中存数据传入到第一个Activity。

第一个Activity :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
requestCode = 1;
Intent intent = new Intent(MainActivity.this, TestActivity.class);
startActivityForResult(intent,requestCode);
}
});
}
//回调方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == 1) {
Bundle bd = data.getExtras();
String text1 = bd.getString("text1");
mTextView1.setText(text1);
Log.i("2333", text1);
}
}

第二个Activity :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testactivity);
mButton3 = findViewById(R.id.button3);
requestCode = 1;
Intent intent = getIntent();
Bundle bundle = new Bundle();
bundle.putString("text1","辣鸡1");
bundle.putString("text2", "辣鸡2");
intent.putExtras(bundle);
this.setResult(requestCode, intent);
mButton3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TestActivity.this.finish();
}
});
}
我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?