700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android的子线程(Thread)和Service IntentService的区别?

Android的子线程(Thread)和Service IntentService的区别?

时间:2023-02-07 04:45:26

相关推荐

Android的子线程(Thread)和Service IntentService的区别?

目录

Thread

Android 三种方式开启子线程

Handler(句柄)

什么时候使用handler?

如何定义handler?

如何将子线程中的消息传递给主线程?

在主线程是如何接受消息,并处理消息呢?

在主线程接收到消息,如何更新UI?

进度条

Service解决ANR

IntentService

IntentService和Service的区别?

如何创建一个IntentService?

handlerThread

Thread

Android 三种方式开启子线程

第一种方式继承Thread:

class MyThread extends Thread{@Overridepublic void run() {super.run();//耗时操作try {sleep(3000);String s="世界和平";Log.i("Thread方式收到的值是:",s);} catch (InterruptedException e) {e.printStackTrace();}}}MyThread myThread=new MyThread();myThread.start();

第二种方式实现Runnable接口:

class MyRunnable implements Runnable{@Overridepublic void run() {try {Thread.sleep(3000);String s="吧啦蹦吧必读蹦";Log.i("Runnable收到的值是",s);} catch (InterruptedException e) {e.printStackTrace();}}}MyRunnable myRunnable=new MyRunnable();Thread thread=new Thread(myRunnable);thread.start();

第三种方式Thread和Runnable结合(常见、推荐):

new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000);String s="M78星云";Log.i("接收到的值是:",s);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}

Handler(句柄)

package com.hp.demo;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.widget.TextView;/*** 从服务器接收到用户的昵称,并将昵称设置在textview对应的text属性上** 连接服务器的功能,是属于耗时任务,所以必须放在子线程** 子线程中是没有办法修改页面,借助Handler给主线程传递消息** 主线程接收到消息后,开始执行修改UI*/public class MainActivity2 extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);textView=findViewById(R.id.textView);// 模拟一个连接服务器的过程new Thread(new Runnable() {@Overridepublic void run() {try {// 本意是想表达 连接服务器的耗时操作Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}// 假如从服务器获取到昵称为:哈撒给String s="哈撒给";// 将昵称给textview设置上,在子线程中更新UI,是不允许的,必须使用handler将消息传递回去Message message=new Message();message.what=1;message.obj=s;handler.sendMessage(message);}}).start();}private Handler handler=new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if (msg.what==1) {String r= (String) msg.obj;textView.setText(r);}}};}

什么时候使用handler?

将子线程中的消息传递给主线程。例如:更新UI

如何定义handler?

private Handler handler = new Handler(Looper.getMainLooper()){};

如何将子线程中的消息传递给主线程?

方式一:Message msg = new Messag();msg.what = 1;msg.obj = "内容";handler.sendMessage(msg);方式二:handler.sendEmptyMessage(0x111);//0x111表示0的十六进制代码

在主线程是如何接受消息,并处理消息呢?

private Handler handler = new Handler(Looper.getMainLooper()){handleMessage(Message msg) {if(msg.what == 1) {}}};

在主线程接收到消息,如何更新UI?

private Handler handler = new Handler(Looper.getMainLooper()){handleMessage(Message msg) {if(msg.what == 1) {tv_show.setText("123");}}}

进度条

package com.hp.demo;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.widget.ProgressBar;public class MainActivity3 extends AppCompatActivity {private ProgressBar progressBar;private int num=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);progressBar=findViewById(R.id.progressBar);new Thread(new Runnable() {@Overridepublic void run() {// 循环对num进行值得修改while (num<100){try {Thread.sleep(1000);num++;handler.sendEmptyMessage(0);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}private Handler handler=new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if (msg.what==0){progressBar.setProgress(num);}}};}

Service解决ANR

package com.hp.demo;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class MyService extends Service {public MyService() {}@Overridepublic void onCreate() {Log.i("service","service线程已创建");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("service","service线程已开启");new Thread(new Runnable() {@Overridepublic void run() {long endtime=System.currentTimeMillis()+20*1000;//获取当前系统时间再加上20秒while (System.currentTimeMillis()<endtime) {synchronized (this) {try {wait(endtime - System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}stopSelf();}}).start();return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i("service","service线程已销毁");super.onDestroy();}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}}

结论:

Service不会自动开启线程,也不会自动停止线程

IntentService

IntentService是Service的一个子类

IntentService和Service的区别?

Service 不会自动开启线程,也不会自动关闭线程

IntentService 自动开启线程,自动关闭线程

如何创建一个IntentService?

方式一(手动创建):

new Class-> MyIntentService ->继承IntentService->实现onHandleIntent 和 构造方法

在AndroidManifest.xml中注册,注册时发现报错,报错的原因是没有无参的构造方法, 解决办法:创建无参的构造方法

手动创建IntentService时有两个注意点?

手动写出来无参的构造方法

必须在AndroidManifest.xml进行注册

方式二(快捷键创建):

如图所示:

快捷创建IntentService时的注意点?

删除用不到的方法,留下用到的方法

快捷创建的IntentService会帮你在AndroidManifest.xml进行注册,无需自己注册

handlerThread

handlerThread还是一个线程,带了Looper的线程

package com.hp.demo;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Message;import android.widget.TextView;public class MainActivity6 extends AppCompatActivity {private TextView tv_text2;//HandlerThreadprivate HandlerThread handlerThread;//子线程的句柄(桥梁)private Handler handler;//主线程的句柄(桥梁)private Handler getHandler=new Handler();private String result="hp";private boolean isRun;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main6);tv_text2=findViewById(R.id.tv_text2);handlerThread=new HandlerThread("check_message");handlerThread.start();handler=new Handler(handlerThread.getLooper()){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);try {Thread.sleep(2000);result=result+1;if (isRun){handler.sendEmptyMessage(0);}} catch (InterruptedException e) {e.printStackTrace();}getHandler.post(new Runnable() {@Overridepublic void run() {tv_text2.setText(result);}});}};}@Overrideprotected void onResume() {super.onResume();isRun=true;handler.sendEmptyMessage(0);}@Overrideprotected void onPause() {super.onPause();isRun=false;handler.sendEmptyMessage(0);}@Overrideprotected void onDestroy() {super.onDestroy();handlerThread.quit();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。