Android 三种方式开启子线程
继承Threadclass MyThread extends Thread{
public void run(){
// 写耗时操作代码
// Only the original thread that created a view hierarchy can touch its views.
// 如果子线程已经执行了耗时操作,那么就不能修改视图的属性了;视图的属性只能在UI线程去修改
}
}
MyThread myThead = new MyThread();
myThread.start();
实现Runnable接口
class MyRunnable implements Runnable {
@Override
public void run() {
try {
Thread.sleep(3000);
String result = "runnable 345345";
Log.i("runnable", result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
Thread和Runnable结合
new Thread(new Runnable() {
@Override
public void run() {
// 耗时任务
try {
Thread.sleep(3000);
String result = "匿名线程";
Log.i("匿名线程",result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
Handler
将子线程中的消息传递给主线程。例如:更新UI时使用Handler
定义handlerprivate Handler handler = new Handler(Looper.getMainLooper()){
};
将子线程中的消息传递给主线程
方式一: Message msg = new Messag(); msg.what = 1; msg.obj = "内容"; handler.sendMessage(msg); 方式二: handler.sendEmptyMessage(0x111);主线程的接受消息,并处理消息
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");
}
}
};
拓展:Handler控制进度条
public class MainActivity3 extends AppCompatActivity {
private ProgressBar progressBar;
int status = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
progressBar = findViewById(R.id.progressBar);
new Thread(new Runnable() {
@Override
public void run() {
// 循环对status进行值得修改
while (status < 100) {
try {
Thread.sleep(100);
status++;
handler.sendEmptyMessage(0x111);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
progressBar.setProgress(status);
}
}
};
}
Service制造ANR
package com.jzj.day32tage02;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
public MyService() {
}
@Override
public void onCreate() {
super.onCreate();
Log.i("service","服务启动");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("service","服务开启");
long endtime = System.currentTimeMillis() + 20 * 1000;
while (System.currentTimeMillis() < endtime){
synchronized (this){
try {
wait(endtime - System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("service","服务销毁");
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
Service解决ANR
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("serivce","服务已开启");
new Thread(new Runnable() {
@Override
public 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);
}
IntentService
如何创建一个IntentService
new Class-> MyIntentService ->继承IntentService->实现onHandleIntent 和 构造方法
在AndroidManifest.xml中注册,注册时发现报错,报错的原因是没有无参的构造方法,解决办法:创建无参的构造方法 IntentService 会自动开启线程,并在执行完毕后,关闭线程
package com.jzj.day32tage02;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
import androidx.annotation.Nullable;
public class MyIntentService extends IntentService{
public MyIntentService() {
super("MyIntentService");
}
public MyIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.i("IntentService","服务开启");
long edintime = System.currentTimeMillis() + 20 * 1000;
while (System.currentTimeMillis() < edintime){
synchronized (this){
try {
wait(edintime - System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("IntentService","服务销毁");
}
}
handlerThread
- 如图创建页面效果
- 当用户点击开始计数按钮时,输入框值每1000毫秒增加1
- 当用户点击停止计数按钮时,停止计数
package com.jzj.day32homework;
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.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity4 extends AppCompatActivity {
private Button but_01;
private Button but_02;
private EditText editText;
private HandlerThread mhandlerThread;
private Handler threadHandler;
private Handler mHandler = new Handler();
private boolean isRun = true;
int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4);
but_01 = findViewById(R.id.button);
but_02 = findViewById(R.id.button2);
editText = findViewById(R.id.et_1);
but_01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isRun = true;
threadHandler.sendEmptyMessage(0x111);
}
});
but_02.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isRun = false;
threadHandler.sendEmptyMessage(0x111);
}
});
mhandlerThread = new HandlerThread("hand");
mhandlerThread.start();
threadHandler = new Handler(mhandlerThread.getLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
try {
Thread.sleep(500);
i = Integer.parseInt(editText.getText().toString());
i+=1;
if(isRun)
threadHandler.sendEmptyMessage(0x111);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHandler.post(new Runnable() {
@Override
public void run() {
editText.setText(i+"");
}
});
}
};
}
@Override
protected void onDestroy() {
super.onDestroy();
mhandlerThread.quit();
}
}



