任务要求:
需要提交所有类的Java源文件代码和布局文件代码(xml文件),注意:提交Java源文件代码时选择代码语言为Java,提交布局文件代码时选择代码语言为XML
任务描述:
利用Thread+Handler方式,实现屏幕闪烁效果,使界面背景颜色为蓝色、绿色交替出现,时间间隔为2秒,每种颜色出现100次以后停止。已知Android系统已经定义了一些颜色资源,我们在程序中可以直接使用,蓝色的资源ID为android.R.color.holo_blue_light,绿色的资源ID为android.R.color.holo_green_light。
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
</RelativeLayout>
strings.xml:
<resources>
<string name="app_name">多线程</string>
</resources>
MainActivity.java:
package com.example.homework05;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
private RelativeLayout relativeLayout;
private int backgroundColor;//背景色
private int blueNum;//记录蓝色背景出现次数的计数器
private int greenNum;//记录绿色背景出现次数的计数器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
relativeLayout = findViewById(R.id.relativeLayout);
//在主线程中启动子线程
new MyThread().start();
}
//1.在主线程中创建Handler匿名子类对象
private Handler handler = new Handler(){
@Override
//3.处理Message
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 1:
//设置界面的背景色
relativeLayout.setBackgroundColor(getResources().getColor(backgroundColor));
break;
}
}
};
//子线程(继承Thread类)
private class MyThread extends Thread{
@Override
public void run() {
//因为两种颜色是交替出现,而题目中要求每种颜色出现100次以后停止
//所以只有当两种颜色出现次数较少的一个(两者中后出现的那个)出现100次之后使线程停止
while (blueNum < 100 || greenNum < 100){
try {
//2.发送数据给UI线程
Message message = new Message();
message.what = 1;//区分不同的消息对象
message.obj = getBackgroundColor();//发送的背景色
handler.sendMessage(message);//发送消息,进入主线程的消息队列
//设置线程休眠时间为2秒钟
MyThread.sleep(2000);
} catch (InterruptedException e) {
MyThread.currentThread().interrupt();//终止线程
}
}
}
}
//获取背景颜色
private int getBackgroundColor(){
//当没有设置背景色(使用默认背景色)时,令backgroundColor为蓝色,
//当背景色是蓝色时,将其设置为绿色;反之亦然
// 同时在设置背景色时使该种颜色的计数器+1
if (backgroundColor == 0) {
backgroundColor = android.R.color.holo_blue_light;
blueNum++;
} else if (backgroundColor == android.R.color.holo_blue_light) {
backgroundColor = android.R.color.holo_green_light;
greenNum++;
} else {
backgroundColor = android.R.color.holo_blue_light;
blueNum++;
}
return backgroundColor;
}
}