最近经常有人问我什么是进程,什么是线程,进程间如何通信,原理是什么?今天有时间我就简单讲讲我的理解,如果有不对的地方求指教:(我是新手我怕谁 )
首先我们说说概念,线程是cpu中最小的单位,每一个线程可以是一个请求,一个处理事件。而进程在android中可以是一个应用,而一个应用中可以有多个进程,在进程中可以有多个线程,或者一个线程(主线程),比如说我们的进程来代表打开电脑这个动作,而线程可以是我们按下电脑开机键+我们手指离开开机键这个操作,其实很好解释。
那么为什么要用多线程呢?就android来言,android主进程中不允许做耗时的操作,如果执行了很可能就anr,而且非常影响体验,针对线程这一节,以后会单独写一篇这里不做解释了
那么为什么需要多进程呢?这个问题一般是由于特殊的原因放到独立的进程中,防止占用内存太多,影响app的体验,因为android在很早的版本 给apk发配内存只有16m,而现在的手机虽然分配的已经很大,但是有干不过产品的要求啊,所以在这样的情况下,单独给app分配一个内存空间是有必要的
那么android中如何判断是多进程呢?可以通过adb 查看进程中是不是多了一个在androidmenifest 中指定四大主键 process:"abc" abc的进程,而android会默认给每一个进程一个UUid
多进程优势有很多,但是他的炕也是很多的,第一数据同步:第二静态变量修改只能修改当前进程中的数据,第三线程同步无法实现,第四:applaction会创建多次
针对不同的问题我们做不同处理:
如果要做进程通信,还需要对对象序列号了解:一般有两种方式:1.实现serializable接口 这个是java提供的
2.android提供了parceable方式,用起来效率比较高,但是代码实现相对麻烦
实现Parcelable就是为了进行序列化,那么,为什么要序列化?
1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。
代码如下:
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by fengxb on 2016/5/24.
*/
public class UserBean implements Parcelable {
private String uName;
public int getuAge() {
return uAge;
}
public void setuAge(int uAge) {
this.uAge = uAge;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
private int uAge;
public UserBean(){
}
protected UserBean(Parcel in) {
String s = in.readString();
int i = in.readInt();
}
public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {
@Override
public UserBean createFromParcel(Parcel in) {
return new UserBean(in);
}
@Override
public UserBean[] newArray(int size) {
return new UserBean[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(uName);
parcel.writeInt(uAge);
}
}
而传值的时候
Intent mIntent = new Intent(this,parcelable_test.com.ParcelableTest2.class);
Bundle mBundle = new Bundle();
<pre name="code" class="html" style="font-size: 18px; font-weight: bold;"><span style="font-family: Arial, Helvetica, sans-serif;">UserBean </span><span style="font-family: Arial, Helvetica, sans-serif;">mPerson=</span><span style="font-family: Arial, Helvetica, sans-serif;"> new </span><span style="font-family: Arial, Helvetica, sans-serif;">UserBean():</span>
mBundle.putParcelable(KEY,
mPerson
);
mIntent.putExtras(mBundle); startActivity(mIntent);
在两一个acitivty中读取:
<span style="font-family: FangSong_GB2312;font-size:18px; background-color: rgb(255, 255, 255);">UserBean</span><pre name="code" class="html" style="display: inline !important;"> mPerson
= (
UserBean
)getIntent().getParcelableExtra(ParcelableTest.KEY);
看代码也是很简单的
Binder理解不容,大家可以去查看相关文章
这里主要讲解如何跨进程传值,android通常使用Intent 和Binder方式进行进程通信,ContentProvider本身就支持跨进程共享数据,还有一种方式是通过网络socket通信。还有一种也是可以读取文件 sharedpreferences,但是多进程的时候高并发读写可能出现数据丢失,不建议使用