您的位置:首页 > 其它

Processes and Threads

2016-08-01 16:13 351 查看
当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);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: