android 多线程 异步消息处理 服务 学习笔记 (六)
三种多线程编程方法
1 class Mythread extends Thread{
@Override
public void run(){}
}
new Mythread().start()
2 class Mythread implements Runnable{
@Override
public void run(){}
}
Mythread myThread=new Mythread();
new Thread(myThread).start();
3 new Thread{new Runnable{
@Override
public void run(){}
}.start();
异步消息处理机制(使用message更新ui)
public class MainActivity extends Activity implements OnClickListener{
Button button;
TextView text;
public static final int change=1;
private Handler handler=new Handler(){
public void handleMessage(Message ms){
switch(ms.what){
case change:
text.setText("nice to meet you");
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button) findViewById(R.id.change_Button);
text=(TextView)findViewById(R.id.text);
button.setOnClickListener(this);
}
public void onClick(View v){
switch (v.getId()) {
case R.id.change_Button:
new Thread(new Runnable(){
public void run(){
Message ms=new Message();
ms.what=change;
handler.sendMessage(ms);
}
}).start();
break;
default:
break;
}
}
}
使用AsynvTask更新ui
class DownloadTask extends AsyncTask<Void,Integer,Boolean>{
@Override
protected void onPreExecute(){
progressDialog.show();
}
@0verride
protected Boolean doInBackground(Void...params){
try{
while(true){
int downloadPercent=doDownload();
publishProgress(downloadPercent);
if(downloadPercent>=100){
break;
}
}
}catch(Exception e){
return false;
}
return true;
}
protected void onProgressUpdate(Integer...values){
progressDialog.setMessage("Download"+values[0]+"%");
}
@Override
protected void onPostExecute(Boolean result){
progressDialog.dismiss();
if(result){
Toast.makeText(context,"Download succeeded",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,"Download failed",Toast.LENGTH_SHORT).show();
}
}
}
定义一个服务
服务定义完成后要使用的话必须同android其他三大组件一样在manifest中注册才行 <service android:name=".MyService"></service>
在活动中启动或停止服务的话使用intent
Intent intent=new Intent(this,Myservice.class);
startService(intent);
Intent intent1=new Intent(this,Myservice.class);
stopService(intent1);或者是在服务的定义中调用stopSelf()来停止服务
public class MyService extends Service{
public IBinder onBind(Intent intent){
return null;
}
public void onCreate(){
super.onCreate();
}
public int onStartCommand(Intent inten,int flags,int startId){
return super.onStartCommand(intent,flags,startId);
}
public void onDestroy(){
super.onDestroy();
}
}
活动和服务进行通信:使用onBind()
public class MyService extends Service{
private DownloadBinder mBinder=new DownloadBinder();
class DownloadBinder extends Binder{
public void startDownload(){
Log.d("MyService","startdownload");
}
public int getProgress(){
Log.d("MyService","getProgress")
return 0
}
}
public IBinder onBind(Intent intent){
return mBinder;
}
}
主活动中调用 先建立一个ServieceConnection匿名类
private ServiceConnection connection=new ServiceConnection(){
public void onServiceDisconnected(ComponentName name){}
public void onServiceConnected(ComponentName name,IBinder service){
MyService.DownloadBinder downloadBinder=(MyService.DownloadBinder)service;获得一个DownloadBinder实例
downloadBinder.startDownload();
downloadBinder.getProgress();
}
}
Intent bindintent=new Intent(this,MyService.class);
bindService(bindintent,connection,BIND_ANTO_CREATE);绑定服务并且绑定后自动创建
。。
unbinderService(connection);解绑,connection为前面定义的ServiceConnection实例
注意服务在任何活动中都是通用的 可以和任何activity 进行绑定
使用intentService(可以自己开启线程并且可以自动停止)
定义:
public class MyIntentService extends IntentService {
public MyIntentService( ) {
super("MyIntentService");
// TODO Auto-generated constructor stub
}
protected void onHandleIntent(Intent intent){
Log.d("MyIntentService","thread id id"+Thread.currentThread().getId());
}
public void onDestroy(){
super.onDestroy();
Log.d("MyIntentService","ondestroy exe");
}
}
在活动中启动或者的方法是一样的
Intent intentService=new Intent(this,MyIntentService.class);
startSercice(intentService);
同样要进行注册注册方法和普通服务一样的
服务的最佳实践 定时循环开启一项服务:
public class LongRunningService extends Service {
public IBinder onBind(Intent intent){
return null;
}
public int onStartCommand(Intent intent,int flags,int startId){
new Thread(new Runnable(){
public void run(){
Log.d(".","");
}
}).start();
AlarmManager manager=(AlarmManager)getSystemService(ALARM_SERVICE);
int anHour=60*60*1000;
long triggerAtTime=SystemClock.elapsedRealtime()+anHour;
Intent i=new Intent(this,AlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(this,0,i,0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pi);
return super.onStartCommand(intent, flags, startId);
}
}
定义一个广播接收器
public class AlarmReceiver extends BroadcastReceiver{
public void onReceive(Context context,Intent intent){
Intent i=new Intent(context,LongRunningService.class);
context.startService(i);
}
}
在活动中进行启动这个服务 一旦启动就会不断重复
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent(this,LongRunningService.class);
startService(intent);
}
注意 :现在的手机当中为了省电,当存在多个Alarm定时任务的时候,他会
把时间相近的几个任务集合在一起去唤醒cpu,所以会有一些时间上的误差,为了准确无误,可以
把服务中manager.set()改为manager.setExact()
android 多线程 异步消息处理 服务 学习笔记 (六)的更多相关文章
- Android多线程----异步消息处理机制之Handler详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- ArcGIS Runtime for Android 使用异步GP服务绘制等值线
关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...
- (转)ArcGIS Runtime for Android 使用异步GP服务绘制等值线
关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...
- Spring Cloud微服务学习笔记
Spring Cloud微服务学习笔记 SOA->Dubbo 微服务架构->Spring Cloud提供了一个一站式的微服务解决方案 第一部分 微服务架构 1 互联网应用架构发展 那些迫使 ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- Ajax的XMLHttpRequest对象
编写一个例子:从服务器取回一个Hello Ajax字符串. HTML: <input type="button" value="ajax提交" oncli ...
- 求大神帮忙解决一下c#winfrom bindingNavigatorPositionItem加载直接跳转问题
c# winfrom bindingNavigatorPositionItem控件问题加载直接跳转到相对应的行的问题
- 互联网轻量级框架SSM-查缺补漏第一天
简言:工欲其事必先利其器,作为一个大四的准毕业生,在实习期准备抽空补一下基础.SSM框架作为互联网的主流框架,在会使用的基础上还要了解其原理,我觉得会对未来的职场会有帮助的.我特意的买了一本<J ...
- 软件测试技术lab2——Selenium上机实验
Selenium上机实验说明 1.安装SeleniumIDE插件 2.学会使用SeleniumIDE录制脚本和导出脚本 3.访问http://121.193.130.195:8080/使用学号登录系统 ...
- 【数据库】6.0 MySQL入门学习(六)——MySQL启动与停止、官方手册、文档查询
1.0 MySQL主要有四种启动方式:直接启动.安全启动.服务启动.多实例启动. 直接启动: 服务器启动: 安全启动(最常用): 多实例启动: 2.0如何获得MySQL帮助 2.1官方手册 下面提供百 ...
- Angular 基础教程(1)
简介 什么是AngularJS 一个功能非常完备的前端框架,通过增强HTML的方式提供一种便捷开发Web应用程序的方式 其核心特点就是几乎无任何DOM操作,让开发人员的精力和时间全部集中于业务 MVC ...
- ArcGisJS实现地图常用工具条、距离测量和面积测量(非官方实例)
常用地图工具包括:平移.拉框缩小.拉框放大.全图.距离测量.面积测量.清除标记,距离测量.面积测量没有使用官方自带的组件代码. 1.距离测量 2.面积测量 3.源代码 <!DOCTYPE htm ...
- .NET开源工作流RoadFlow-表单设计-HTML编辑器
roadflow目前采用的html编辑器为ueditor编辑器(和表单设计器的编辑器相同). 绑定字段:与数据表的某个字段对应. 宽度:编辑器的宽度. 高度:编辑器的高度. 运行效果如下:
- SqlServer数据库全角和半角互转的方法
---摘要: SqlServer数据库全角和半角互转的方法 CREATE FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit -- ...
- java 将long类型的数值转无符号数
由于JAVA中基本数据类型均为有符号数,而且最大数据类型long为8字节假如long为负数时,最高位为1,转为无符号数时会超出long的取值范围,所以转换规则如下: 方法: public static ...