Android多线程应用

任务要求:
需要提交所有类的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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FF小迷糊吖~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值