论坛首页 移动开发技术论坛

android process and thread

浏览 3210 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-18   最后修改:2011-07-18
前三周android预研中,把可能用到的技术点都识别了,并完成了一个DEMO。之后一直在等UCD的同事把应用界面设计出来。。等待过程中有点无聊,就把android in action看完了,UCD的设计结果还是没出来,于是继续看google的android文档。刚才看到process and thread这节,总结整理一下

通过在manifest中配置,是可以改变android系统的默认行为的,不过好像没想到有什么场景需要这样做,所以这篇博客只总结默认配置下的情况

1. 一个application对应一个process

2. 所有的component(包括activity,service)都跑在同一个thread中,这个thread是main线程,也叫UI thread。也就是如果应用不做额外的编码,所有的组件都跑在同一个线程中。。

3. android还是比较好心的,it tries to maintain an application process for as long as possible

4. 但在资源不够的情况下,android系统就开始kill process了。优先级包括,foreground process、visible process、service process、background process、empty process。从后往前依次kill

5. 进程之间有依赖关系的话,process that is serving another process can never be ranked lower than the process it is serving

6. 由于前面2提到的,默认所有组件都跑在UI thread里,页面UI响应会很不好,所以要编码解决这个问题。需要遵循2条规则:
A. 不能阻塞UI thread
B. 不要在UI thread之外访问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();
}

上面的代码就违反了规则2,在worker thread中访问了UI组件mImageView
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();
}

上面的代码就比较好了,但是可以用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);
    }
}
   发表时间:2011-07-18  
关于process的rank,分别说明如下。

Foreground Process,前台进程,指的是满足以下任一条件的进程:
1. 持有onResume()调用后的activity,也就是正在与用户进行交互的activity
2. 持有绑定到前台activity的service
3. 持有run in foreground的service
4. 持有正在执行onCreate()、onStart()、onDestroy()的service
5. 持有正在执行onReceive()的BroadcastReceiver

Visible Process,可视进程,指的是满足以下任一条件的进程:
1. 持有onPause()调用后的activity,也就是该activity仍然是可见的,但是不是focus
2. 持有绑定到visible activity的service

Servive Process,服务进程,持有用startService()启动的service的进程

Background Process,后台进程,持有已经调用了onStop()方法的activity的进程

Empty Process,空进程。这种进程中的所有组件都已经释放,已经不再持有任何组件
0 请登录后投票
   发表时间:2011-07-18  
有点儿意思,LZ辛苦了,赞一个!
0 请登录后投票
   发表时间:2011-07-21  
楼主总结不错
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics