Processes and Threads

本文介绍Android应用中进程与线程的管理方式,包括如何指定组件运行在特定进程,系统如何管理不同类型的进程,以及如何避免阻塞UI线程,并提供了从非UI线程更新UI的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当application 第一次执行的时候,Android 系统会开始一个新的Linux 进程来执行application.application的所有组件都运行的同一个进程中,n你也可以让application的组件运行在不同的进程中.
Android的四大组件可以在manifest文件中通过Android:process 来指定组件运行在哪个进程中. <application> 也有Android:process 可以指定所以的组件运行在同一个进程中.当系统memory不足时,Android 系统会kill一些进程以回收内存。对用户越不重要的进程,越容易被kill掉.
1:Foreground process
2:Visible process
3:Service process
4:backgroud process
5:Empty process
当application开始运行时,系统会创建一个main thread(也就UI线程).不要block UI线程,不要再非UI线程中更新UI
当有操作可能block UI线程是,一般new thread运行,如下所示:
public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}
Android 提供三种方法从非UI线程中更新UI。
Activity.runOnUiThread(Runnable)
view.post(Runnable)
view.postDelayed(Runnable,long)
当然也可以用handle机制.
举例如下:
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 可以异步的执行,AsyncTask是一个虚类,必须实现其子类。需要重写doInBackground做耗时的工作,
在onPostExecure中更新UI.
public void onClick(View v) {
    new DownloadImageTask().execute("http://example.com/image.png");
}


private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    /** The system calls this to perform work in a worker thread and
      * delivers it the parameters given to AsyncTask.execute() */
    protected Bitmap doInBackground(String... urls) {
        return loadImageFromNetwork(urls[0]);
    }


    /** The system calls this to perform work in the UI thread and delivers
      * the result from doInBackground() */
    protected void onPostExecute(Bitmap result) {
        mImageView.setImageBitmap(result);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值