22、多进程和多线程

 Android进程简介

Android会启动一个LINUX进程和一个主线程。默认的情况下,所 有该程序的组件都将在该进程中运行。当启动应用程序时,Linux会为每 一个程序单独分配一个进程,该进程默认只拥有一个主线程。

组件可以运行在当前进程中,也可以运行在其他进程中。组件运行在 哪个进程中是在AndroidManifest.xml文件中设置的,其中<Activity>, <Service>,<receiver>和<provider>都有一个process属性来指定该 组件运行在哪个进程之中。

每一个进程不会创建新的线程,所有的处理事件都是在主线程中完 成的,例如,onClick。 

前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何 时候都存在。他们是最后一个被结束的,当内存低到根本连他们都不能运 行的时候。一般来说, 在这种情况下,设备会进行内存调度,中止一些 前台进程来保持对用户交互的响应。 

可见进程不包含前台进程的组件。但是会在屏幕上显示一个可见的UI。 除非前台进程需要获取它的资源,不然不会被中止。

例如,如果前台Activity是一个对话框的话,就会允许在它后面看到 前一个Activity。 

(后台进程)后台不可见的进程。例如,后台运行的Activity、Service等。 

(空进程)未运行任何程序组件的线程。运行这些进程的唯一原因是作为一个缓 存,缩短下次程序需要重新使用的启动时间。系统经常中止这些进程,这 样可以调节程序缓存和系统缓存的平衡。 

 并发与UI更新

Handler    Message 

 

 1 import android.app.Activity;
 2 import android.os.Bundle;
 3 import android.os.Handler;
 4 import android.os.Message;
 5 import android.view.View;
 6 import android.widget.TextView;
 7 
 8 public class UpdateUIActivity extends Activity {
 9     private TextView mTextView;
10 
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_update_ui);
15         mTextView = (TextView) findViewById(R.id.textView1);
16     }
17 
18     public class NoHandler implements Runnable {
19         @Override
20         public void run() {
21             try {
22                 mTextView.setText("No Handler");
23             } catch (Exception e) {
24                 e.printStackTrace();
25             }
26         }
27     }
28 
29     // 不使用Handler
30     public void onClick_NoHandler(View view) {
31         // mHandler.post(new NoHandler());
32         Thread thread = new Thread(new NoHandler());
33         thread.start();
34     }
35     
36     // 使用Handler
37     public void onClick_Handler(View view) {
38         Thread thread = new Thread(new MyHandler(mHandler));
39         thread.start();
40     }
41     
42     public class MyHandler implements Runnable {
43         private Handler mHandler;
44 
45         public MyHandler(Handler handler) {
46             mHandler = handler;
47         }
48 
49         @Override
50         public void run() {
51             Message message = new Message();
52             message.obj = "Handler";
53             mHandler.sendMessage(message);
54         }
55 
56     }
57 
58     Handler mHandler = new Handler() {
59         @Override
60         public void handleMessage(Message msg) {
61             String str = String.valueOf(msg.obj);
62             mTextView.setText(str);
63         }
64     };
65 
66 }

 

 

 

 AsyncTask 

AsyncTask<Params, Progress, Result> 需要指定三个泛型 

 

 1 import android.app.Activity;
 2 import android.os.AsyncTask;
 3 import android.os.Bundle;
 4 import android.view.View;
 5 import android.widget.ProgressBar;
 6 import android.widget.TextView;
 7 import android.widget.Toast;
 8 
 9 public class AsyncTaskActivity extends Activity {
10     private ProgressBar mProgressBar;
11     private TextView mTextView;
12     private ProgressAsyncTask mProgressAsyncTask;
13 
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_async_task);
18         mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
19         mTextView = (TextView) findViewById(R.id.textView1);
20     }
21 
22     private class ProgressAsyncTask extends AsyncTask<String, Integer, Integer> {
23         private int mCount;
24         @Override
25         protected Integer doInBackground(String... params) {
26             mProgressBar.setMax(params.length);
27             mCount = params.length;
28 
29             for (int i = 0; i < mCount; i++) {
30                 publishProgress(i + 1);
31                 if (isCancelled())
32                     break;
33                 try {
34                     Thread.sleep(2000);
35                 } catch (Exception e) {
36 
37                 }
38             }
39             return params.length;
40         }
41 
42         @Override
43         protected void onPostExecute(Integer result) {
44             super.onPostExecute(result);
45             Toast.makeText(AsyncTaskActivity.this, "任务完成,共处理" + result + "个值.",
46                     Toast.LENGTH_LONG).show();
47         }
48 
49         @Override
50         protected void onProgressUpdate(Integer... values) {
51             super.onProgressUpdate(values);
52             mProgressBar.setProgress(values[0]);
53             mTextView.setText(100 * values[0] / mCount + "%");
54         }
55 
56         @Override
57         protected void onCancelled() {
58             Toast.makeText(AsyncTaskActivity.this, "任务已取消", Toast.LENGTH_LONG)
59                     .show();
60 
61             super.onCancelled();
62         }
63 
64     }
65 
66     public void onClick_Start(View view) {
67         mProgressAsyncTask = new ProgressAsyncTask();
68         mProgressAsyncTask.execute("str1", "str2", "str3", "str4", "str5");
69     }
70 
71     public void onClick_Cancel(View view) {
72         mProgressAsyncTask.cancel(true);
73     }
74 }

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker小白到实战之常用命令演示,通俗易懂

前言上一篇大概认识了Docker&#xff0c;主要是从概念、架构、优点及流程方面进行阐述&#xff0c;并进行安装和体验&#xff1b;接下来就开始进行实操学习&#xff0c;在演示过程中会针对关键的知识点进行归纳和总结&#xff0c;这里先从常用命令说起&#xff0c;来吧&#xf…

lumen 配置数据库结果自动转数组_lumen 数据库操作 Cannot use object of type stdClass as array...

你可能记得&#xff0c;操作数据库时$dataList 什么什么 ->get();能查询到数据 数据结果为数组加stdClass类型你使用 $dataList $dataList->toArray();进行数据转化结果你发现&#xff0c;没有正确转化,你再到里面去转化&#xff0c;但结果证明也是徒劳foreach ($allDa…

今天这个日子,大多数人都不知道…

全世界只有3.14 % 的人关注了爆炸吧知识我是蝙蝠&#xff0c;身体虽小五毒俱全你确定要尝吗&#xff1f;我是果子狸&#xff0c;人们一度“谈我色变”但如今又被端上餐桌&#xff01;我是野兔&#xff0c;人们说我很可爱我的肉却变成“野味”毛发变成皮草……今天&#xff0c;世…

PostgreSQL表的行数统计

PostgreSQL表的行数统计 在很多情况下我们需要知道一个表的记录数有多少。如果你发现你有这样的需求&#xff0c;你还应该问问这样的统计的精确度到底又多高。如果你在做会计报表&#xff0c;你需要非常的精确。如果你做一个网页的记数器&#xff0c;可能有一些误差也是允许的…

SharePoint at .NET技术大会

在这个月上海举行的.NET技术大会上&#xff0c;我将奉献一节名为《基于SharePoint的Web应用开发模型》的课程。由于大会的定位是“面向企业级.NET开发深度应用”&#xff0c;我相信大家想听的一定不是单纯的介绍SharePoint Server&#xff0c;或是怎么做一个Web Part。思来想去…

对DDD的常见误区

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「205」篇原创敬上大家好&#xff0c;我是Z哥。我从 2014 年开始接触 DDD 到现在也有 7 年多时间了&#xff0c;在这个期间踩过很多坑&#xff0c;也是自己慢慢从充…

Python办公自动化Day2-openpyxl

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;常规操作添加数据遍历所有单元格数据合并/取消合并单元格添加/删除行与列移动指定范围单元格 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 Python办公自动化自学笔记知识…

vsftpd服务

实验1VSFTPD实验环境在虚拟机Linux 6.5系统下需要2台Linux系统一台A作为服务端一条B作为测试客户端开启2台Linux系统。实验目标A作为服务端配置VSFTPD服务器实现FTP服务。B作为测试客户端验证服务器A的共享是否有效。配置真实主机确保真实主机能ping通2台虚拟机。实验步骤1. 首…

传递函数_使用python计算麦克风阵列信号的传递函数

使用python写了一个测试麦克风阵列传递函数的demo&#xff0c;有需要的自取。该代码使用了第三方库ThinkDSP。1. 传递函数首先解释下什么是传递函数&#xff1a;把具有线性特性的对象的输入与输出间的关系&#xff0c;用一个函数(输出波形的拉普拉斯变换与输入波形的拉普拉斯变…

LNK2005 连接错误解决办法

nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2YAPAXIZ) 已经在 LIBCMTD.lib(new.obj) 中定义nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3YAXPAXZ) 已经在 …

中国数学竞赛史上最玩命的“赌徒”,为了国家荣誉,他不惜用生命换来了五次世界第一...

全世界只有3.14 % 的人关注了爆炸吧知识知识君今天&#xff0c;要跟大家介绍的是&#xff0c;北大历史上首位被授予博士学位的人&#xff0c;深受癌症折磨的同时还带领着中国学子连续5次站上世界顶端的人&#xff0c;他的故事&#xff0c;他的品格&#xff0c;值得被所有人记住…

33条C#、.Net经典面试题目及答案[zt]

本文集中了多条常见的C#、.Net经典面试题目例如“.NET中类和结构的区别”、“ASP.NET页面之间传递值的几种方式?”&#xff0c;并简明扼要的给出了答案&#xff0c;希望能对学习C#、.Net的读者有所帮助。 1&#xff0c; 请你说说.NET中类和结构的区别? 答&#xff1a;结构和类…

控制用户的访问之权限、角色【weber出品必属精品】

权限的作用 限制用户对数据的访问 权限的分类 1. 系统权限&#xff1a;能够存取数据库的权限 2. 对象权限&#xff1a;操作数据库对象的内容 系统权限 1.1 如何创建用户&#xff1a; SQL> create user test default tablespace users identified by test;用户已创建。 1…

javq接口_Java为什么要使用接口_java接口怎么使用

Java接口是什么Java接口是一系列方法的声明&#xff0c;是一些方法特征的集合&#xff0c;一个接口只有方法的特征没有方法的实现&#xff0c;因此这些方法可以在不同的地方被不同的类实现&#xff0c;而这些实现可以具有不同的行为(功能)。接口(英语&#xff1a;Interface)&am…

[(转)hystar整理]Entity Framework 教程

预备知识 2 LINQ技术 2 LINQ技术的基础 - C#3.0 2 自动属性 2 隐式类型 2 对象初始化器与集合初始化器 3 匿名类 3 扩展方法 4 Lambda表达式 4 .NET中的数据访问 4 DataSet方案 5 改进的的DataSet方案 5 手写代码通过ADO.NET2…

Exchange中的数据库文件

Exchange中的数据库文件Exchange中的数据库文件是edb文件、stm文件和众多的log文件组成.其中以edb结尾的文件是数据库文件.以stm结尾的是流数据文件,以log结尾的是事物日志文件.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />E…

13岁上中科大,17岁攻读哈佛博士,“天才”尹希的开挂人生

全世界只有3.14 % 的人关注了爆炸吧知识2013年美国斯隆基金会(Alfred P. Sloan Foundation)颁发的美国斯隆研究奖获得者尹希&#xff0c;31岁哈佛最年轻的华人教授&#xff0c;获2017年“豪华版诺贝尔奖”之称的科学突破奖-物理学新视野奖&#xff0c;这年唯一的获奖华裔。知识…

强制升级?!.NET Core 2.1容器镜像将从Docker Hub中删除

前言.NET Core 2.1将于2021年8月21日结束支持&#xff0c;本来应该没什么影响&#xff0c;该怎么用继续用得了。但是&#xff0c;如果你在生产环境使用了.NET Core 2.1容器镜像&#xff0c;那就要注意了&#xff0c;从8月21日开始&#xff0c;.NET Core 2.1容器镜像将不再在Doc…

浅谈云计算核心技术

云计算一个高大上的名字&#xff0c;现在我也准备开始学习了&#xff0c;今天看了一本云计算的普及性书籍&#xff0c;将云计算的一些核心技术做一个简要的概括吧。虚拟化技术云计算跟虚拟化不能等同&#xff0c;有位专家说过&#xff0c;虚拟化提供了很好的底层技术平台&#…

“史上“最疯狂”的顶级数学家,看完后忍不住感慨太神了”

▲ 点击查看说起世界上最顶级的数学家&#xff0c;你的脑海中会浮现的&#xff0c;大概是欧拉、高斯、香农等数学巨匠。但是要说起成就和神秘性兼备的&#xff0c;一定就是——称为印度之子的——拉马努金。1887年12月22日&#xff0c;拉马努金出生在印度一个穷困潦倒的家庭&am…