Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言 ~~~

一、分线程通过Handler操作界面

为了使App运行的更加流畅,多线程技术被广泛应用于App开发,由于Android规定只有主线程才能直接操作界面,因此分线程若想修改界面就要另想办法,这要求有一种在线程之间相互通信的机制,如果是主线程向分线程传递消息,可以在分线程的构造方法中传递参数,然而分线程向主线程传递消息并无捷径,为此Android设计了一个Message消息工具,通过结合Handler与Message能够实现线程间通信

由分线程向主线程传递消息的过程主要有四个步骤

1:在主线程中构造一个处理器对象 并启动分线程

2:在分线程中构造一个Message类型的消息包

3:在分线程中通过处理器对象将Message消息发出去

4:主线程的Handler对象处理接收到的消息

综合上面的四个线程通信步骤,接下来通过一个实验观察线程间通信的效果,下面便是利用多线程技术实现新闻滚动的例子

点击开始播放新闻后便会自动播放,每隔两秒钟弹出一条新闻

 

 

点击停止播放新闻则停止播放

 

 根据以上的新闻播放效果,可以知道分线程的播放开始和播放结束指令都成功送到了主线程

代码如下

Java类

package com.example.chapter11;import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.example.chapter11.util.DateUtil;import java.util.Random;@SuppressLint("HandlerLeak")
public class HandlerMessageActivity extends AppCompatActivity implements View.OnClickListener {private TextView tv_message; // 声明一个文本视图对象private boolean isPlaying = false; // 是否正在播放新闻private int BEGIN = 0, SCROLL = 1, END = 2; // 0为开始,1为滚动,2为结束private String[] mNewsArray = { "北斗导航系统正式开通,定位精度媲美GPS","黑人之死引发美国各地反种族主义运动", "印度运营商禁止华为中兴反遭诺基亚催债","贝鲁特发生大爆炸全球紧急救援黎巴嫩", "日本货轮触礁毛里求斯造成严重漏油污染"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler_message);tv_message = findViewById(R.id.tv_message);findViewById(R.id.btn_start).setOnClickListener(this);findViewById(R.id.btn_stop).setOnClickListener(this);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.btn_start) { // 点击了开始播放新闻的按钮if (!isPlaying) { // 如果不在播放就开始播放isPlaying = true;new PlayThread().start(); // 创建并启动新闻播放线程}} else if (v.getId() == R.id.btn_stop) { // 点击了结束播放新闻的按钮isPlaying = false;}}// 定义一个新闻播放线程private class PlayThread extends Thread {@Overridepublic void run() {mHandler.sendEmptyMessage(BEGIN); // 向处理器发送播放开始的空消息while (isPlaying) { // 正在播放新闻try {sleep(2000); // 睡眠两秒(2000毫秒)} catch (InterruptedException e) {e.printStackTrace();}Message message = Message.obtain(); // 获得默认的消息对象//Message message = mHandler.obtainMessage(); // 获得处理器的消息对象message.what = SCROLL; // 消息类型message.obj = mNewsArray[new Random().nextInt(5)]; // 消息描述mHandler.sendMessage(message); // 向处理器发送消息}mHandler.sendEmptyMessage(END); // 向处理器发送播放结束的空消息// 如果只要简单处理,也可绕过Handler,直接调用runOnUiThread方法操作界面
//            runOnUiThread(new Runnable() {
//                @Override
//                public void run() {
//                    String desc = String.format("%s\n%s %s", tv_message.getText().toString(), DateUtil.getNowTime(), "新闻播放结束,谢谢观看");
//                    tv_message.setText(desc);
//                }
//            });isPlaying = false;}}// 创建一个处理器对象private Handler mHandler = new Handler() {// 在收到消息时触发public void handleMessage(Message msg) {String desc = tv_message.getText().toString();if (msg.what == BEGIN) { // 开始播放desc = String.format("%s\n%s %s", desc, DateUtil.getNowTime(), "开始播放新闻");} else if (msg.what == SCROLL) { // 滚动播放desc = String.format("%s\n%s %s", desc, DateUtil.getNowTime(), msg.obj);} else if (msg.what == END) { // 结束播放desc = String.format("%s\n%s %s", desc, DateUtil.getNowTime(), "新闻播放结束");}tv_message.setText(desc);}};}

时间类 

package com.example.chapter11.util;import android.annotation.SuppressLint;
import android.text.TextUtils;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;@SuppressLint("SimpleDateFormat")
public class DateUtil {// 获取当前的日期时间public static String getNowDateTime(String formatStr) {String format = formatStr;if (TextUtils.isEmpty(format)) {format = "yyyyMMddHHmmss";}SimpleDateFormat sdf = new SimpleDateFormat(format);return sdf.format(new Date());}// 获取当前的时间public static String getNowTime() {SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");return sdf.format(new Date());}// 获取当前的时间(精确到毫秒)public static String getNowTimeDetail() {SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");return sdf.format(new Date());}public static String getNowDate() {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");return sdf.format(new Date());}public static String getDate(Calendar calendar) {Date date = calendar.getTime();// 创建一个日期格式化的工具SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 将当前日期时间按照指定格式输出格式化后的日期时间字符串return sdf.format(date);}public static String getMonth(Calendar calendar) {Date date = calendar.getTime();// 创建一个日期格式化的工具SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");// 将当前日期时间按照指定格式输出格式化后的日期时间字符串return sdf.format(date);}public static Date formatString(String strTime) {Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {date = sdf.parse(strTime);} catch (Exception e) {e.printStackTrace();}return date;}}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><Buttonandroid:id="@+id/btn_start"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="开始播放新闻"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_stop"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="停止播放新闻"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="180dp"android:orientation="vertical" ><TextViewandroid:id="@+id/tv_message"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="5dp"android:scrollbars="vertical"android:gravity="left|bottom"android:maxLines="9"android:textColor="@color/black"android:textSize="15sp" /></LinearLayout></LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遇到老赖找催收公司靠谱吗?

转自:http://wenzhang.zhaizhuanzhuan.cn/Detail.aspx?id62B3DBAE-B4E1-F634-F56B-8D8B5F7D2AE0 老赖与催收公司貌似是相互制衡的存在&#xff0c;一个敢“赖”&#xff0c;一个敢要。当这两种极端的个体碰到一起之后&#xff0c;他们真的会相互制衡吗&#xff1f; 就拿身边的…

Android App网络通信中通过runOnUiThread快速操纵界面以及利用线程池Executor调度异步任务实战(附源码 简单易懂)

运行有问题或需要源码请点赞关注收藏后评论区留言私信~~~ 一、通过runOnUiThread快速操纵界面 因为Android规定分线程不能够直接操纵界面&#xff0c;所以它设计了处理程序工具&#xff0c;由处理程序负责在主线程和分线程之间传递数据&#xff0c;如果分线程想刷新界面&#…

记一次基于模板方法的设计开发过程

1、背景 本人做抵押贷金融系统开发&#xff0c;最近在开发过程中&#xff0c;遇到一个新的需求&#xff0c;公司和原第三方支付公司有一定的矛盾&#xff0c;造成支付能力支持不足&#xff0c;公司内部进行的新支付系统的搭建&#xff0c;所以需要将原支付功能对接到新支付功能…

2022 读书总结

2022 年主要阅读了文学类和理财类书籍&#xff0c;增加了几本杂项书籍&#xff0c;具体如下&#xff1a; 文史类 4 本 《软技能 2-软件开发者职业生涯指南》- 约翰.森梅兹《三体&#xff1a;黑暗森林》-刘慈欣《三体&#xff1a;死神永生》-刘慈欣《浪潮之巅》- 吴军理财类 7 本…

派森小镇(五)帮助

雾霭沉沉&#xff0c;水波澄碧。在一处悠远僻静的地方上有一个神奇的小镇&#xff0c;小镇的名字叫派森镇。小镇的前面有一条河&#xff0c;碧蓝的水映出小镇周围水墨画般朦胧的世界。 小镇上的人一出生就拥有特殊的技能&#xff0c;他们中的每一个人都是python的成员&#xff…

零基础 Amazon Web Services (AWS) 入门教程图文版(一)

现在小站唯一的流量都靠AWS这个关键词了,刚好要用AWS重新建站,所以从头开始记录一遍吧。 所谓零基础,就是你可以没有任何AWS使用经历,仍然能够按照教程操作下去。所谓图文版,就是建议手机用户在没有连Wifi的情况下尽量不要查看全文。图片一般都有大图,看不清的可以点击查…

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day22,linux内核视频教程

优秀问答摘自&#xff1a;https://ask.csdn.net/questions/1101634 两者的共同点&#xff1a; 都是用来协调多线程对共享对象、变量的访问 都是可重入锁&#xff0c;同一线程可以多次获得同一个锁 都保证了可见性和互斥性 两者的不同点&#xff1a; ReentrantLock 显示的获…

百万奖金悬赏大模型不擅长的任务!这 11 个任务模型越大,效果越差!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 去年咱们在介绍百万悬赏时提到&#xff0c;“海量资源砸出的大模型真的会一直那么香吗&#xff1f;”&#xff0c;目前来看&#xff0c;自打 ChatGPT 横空出世引领一众大模型开辟新的生活和工作方式以来&#xff0c;还是挺香的…

三本-安全岗-面经总结(多多面经)

三月之前都不知道暑期实习是什么东西&#xff0c;导致错过很多机会&#xff0c;3月末才迷迷糊糊的准备面试&#xff0c;信息差跟环境真的很重要&#xff0c;周边没一个投暑期实习的同学&#xff0c;学校也没有任何提醒&#xff0c;自己一个人摸爬滚投实习、准备、面试&#xff…

数据万象 | AIGC 存储内容安全解决方案

AIGC&#xff08;人工智能生产内容&#xff09; 已经成为与PGC&#xff08;专业生产内容&#xff09;、UGC&#xff08;用户生产内容&#xff09;并驾齐驱的内容生产方式。由于 AI 的特性&#xff0c;AIGC在创意、个性化、生产效率等方面具有独特的优势&#xff0c;这些优势可以…

没关系,前端还死不了

前言 网络上的任何事情都可以在《乌合之众》书中找到答案。大众言论没有理性&#xff0c;全是极端&#xff0c;要么封神&#xff0c;要么踩死。不少人喷前端&#xff0c;说前端已死&#xff1f;前端内卷&#xff1f;前端一个月800包吃住&#xff1f; 对此我想说&#xff0c;“…

Android程序员秋招就业你准备好了嘛?

前言 秋招即将到了&#xff0c;又到了一年一度的大型“程序猿就业典礼”。 从事IT行业那么多年&#xff0c;我自己也经历过&#xff0c;也见过很多求职路上的人生百态。 当初我也是从一个不知名的“打工人”&#xff0c;到如今成为了鹅厂的一员… 这其中经历了太多太多&…

又一AIGC独角兽!帮企业定制大模型,营销物料生成发布全包,Adobe前CTO创办

衡宇 发自 凹非寺量子位 | 公众号 QbitAI 全球范围内的投资者纷纷重金押注AI初创公司这事儿&#xff0c;已经越来越掩藏不住了&#xff01; ——又一家AI初创公司刚刚长成独角兽&#xff0c;这距离其第一次公开露面只过去4个月时间。 最新消息&#xff0c;Adobe前CTO Abhay Par…

“意识机器”初探:如何让大语言模型具备自我意识?

导语 什么是意识&#xff1f;现在的大语言模型具备意识了吗&#xff1f;我们能否造出具备自我意识的机器&#xff1f;在集智俱乐部「后ChatGPT」读书会&#xff0c;北京师范大学系统科学学院教授、集智俱乐部创始人张江老师回顾了意识科学和意识建模领域的进展&#xff0c;认为…

【人工智能AI2.0】清华发布了 ChatGLM-6B 中国大模型5支学术界团队和10大产业界力量介绍

ChatGLM 简介 https://chatglm.cn/login 目录 ChatGLM 简介 ChatGLM 特点 ChatGLM 基于智谱 AI GLM-130B

从脑科学角度解析GPT4及人工智能

来源&#xff1a;图灵教育 本文内容整理自图灵社区直播《对谈 | 刘江 刘嘉&#xff1a;从脑科学 人工智能角度讲透 GPT-4》 刘嘉&#xff0c;清华大学基础科学讲席教授&#xff0c;清华大学心理学系系主任&#xff0c;清华大学脑与智能实验室首席研究员 未来是什么样子&#…

缠论指标缠论指标

点击领取&#xff1a;缠论指标 支持平台 01 通达信(电脑手机&#xff09; 通达信版本简介 02 01 基础版功能&#xff1a; 支持缠论自动分笔&#xff0c;自动线段&#xff0c;显示笔中枢&#xff08;蓝色&#xff09;&#xff0c;线段中枢&#xff08;橙色&#xff09;&am…

tushareAPI获取股票沪深指数

上证指数历史数据采集 ID&#xff1a;503658 代码 # # 导入tushare import tushare as ts # 初始化pro接口 pro ts.pro_api(你自己的TOKEN)# 拉取数据 df pro.index_daily(**{"ts_code": "000001.SH","trade_date": "","st…

同花顺_代码解析_技术指标_P、Q

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 PBX PRICEOSC PSY PSYFS PVT QACD QLCX QLDX PBX 瀑布线 PBX1:(收盘价的M1日移动平均收盘价的M1*2日简单移动平均收盘价的M1*4日简单移动平均)/3 PBX2:(收盘价的M2日移动平均收…

最新和讯网社会责任指数(超详细指标)

1、数据来源&#xff1a;和讯网 2、时间跨度&#xff1a;2011-2020月6日 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 和讯网社会责任指标由50个细分指标构成&#xff0c;全体数据量巨大。费了好大功夫才将这些数据爬取下来&#xff0c;有需要的朋友千万不要错过…