process and thread android中的进程与线程概念

来源:互联网 发布:快乐大本营网络直播 编辑:程序博客网 时间:2024/05/16 11:31

View:

Content:

1、android系统中进程的概念

  在android系统中,当你的应用启动时系统会为其创建一个进程以单线程方式运行,你的应用的所有组件包括Activity和Service都运行在这个主线程内,根据需要你可以自己创建其它的线程来满足应用的需要,比如,你可以为Service开辟一个新的线程来完成费时的任务(这将避免service占有主线程导致Activity报错)。

2、为组件设置android:process属性

  如果你想控制组件属于哪个线程,你可以在manifest文件中设置,不同的组件包括<activity>, <service>, <receiver>,都可以设置android:process属性,你也可以在<application>标签中为所有组件设置默认的android:process属性。

<application android:process=""       ...
<activity       ...
</activity> </application>

  注意:android:process属性是一个String类型,默认的进程名字是你在manifest的中声明的包名。当android:process属性以冒号“:”开始时,这个进程是你的应用私有的;当android:process属性以小写字母开始时,这个进程是全局的可以与其他应用分享,减少对资源的占用。

3、进程的优先级问题

  android系统中为维护系统的正常运行,系统可能会kill掉一些进程,android进程的优先级分为5中,当系统决定kill掉一个进程时,系统会选择优先级相对较低的一个进程kill掉。下面是关于一些进程的优先级信息:(由上而下优先级依次降低)

  1).前台进程

    前台进程是指正在于用户交互的进程,主要包括一下几种情况:

      进程包含一个正在于用户交互的Activity;

      进程包含绑定到activity的service,而它正在与用户进行交互;

      当service调用了startForeground()方法,正以前台的方式运行;

      service正在调用自己的生命周期函数是(onCreate(), onStart(), or onDestroy());

      进程包含一个正在运行onReceive()方法的BroadcastReceiver时。

  在特定的时间只有很少的前台进程在运行,只有当系统的内存低到一定程度时才会kill掉这个级别的进程。

  2).可见进程

    可见进程不包含任何前台组件,但它可以影响到用户在屏幕上看到的东西:

      当进程包含一个不在前台运行的activity(activity失去焦点)但还是对用户可见(比如,被dialog挡住部分时);

      单进程包含一个绑定到可见或一个正在交互的activity时。

  3).服务进程

    正在运行的service。

  4).后台进程

    后台进程包括对用户不可见的activity(当activity调用了onStop()方法后)。

  5).空进程

    所谓的空进程是指不包含任何应用组件的进程,这个进程只是维护缓存,这也是优先级最低的进程。

4、android中的线程(Thread)

  当一个应用启动后系统会为应用创建一个主线程,这个主线程又叫做UI线程,主线程创建后android不会再自动的给其它组件创建线程,所有的组件都运行在UI线程中。

  注意:UI线程是飞线程安全的,在你的应用中:

  1).不要阻塞UI线程

  2).不要通过一个UI线程访问另一个UI线程

5、UI线程的线程安全问题

  这是一个不推荐的更新UI的例子:(要注意尽量不要在你的代码中这样做)

public void onClick(View v) {        new Thread(new Runnable() {            public void run() {                Bitmap b = loadImageFromNetwork("http://example.com/image.png");                mImageView.setImageBitmap(b);            }        }).start();    }

  解决UI线程安全方法:

  1).利用一下特殊方法

  例子:这样做是可以的,但你遇到比较复杂的操作时这种方法也变的很复杂,还有更好的解决办法就是使用AsyncTask(异步任务)。

public void onClick(View v) {        new Thread(new Runnable() {            public void run() {                final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");                mImageView.post(new Runnable() {                    public void run() {                         mImageView.setImageBitmap(bitmap);                    }                });           }      }).start();
}

  2).利用AsyncTask:详细了解

public void onClick(View v) {        new DownloadImageTask().execute("http://example.com/image.png");    }
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); }
protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); }
}