android判断主线程_android中从子线程切换到主线程,但是显得代码很臃肿,请教大牛是怎么自定义的?...

小弟新手一枚,我先来说说我自己在项目中的做法。因为小弟只有JAVAWEB的基础所以只能使用线程池来处理线程之间的切换

1.为了使APP不出现卡顿和内存的低消耗。我是用了synchronized 和用一个Map 来限定每次只能运行一条子线程,Map 键:TAG 线程任务标记 、值:FutureTask线程任务,

2.当然线程之间的切换仍然还是使用handle,只是在等待分线程执行完,当然分线程也会由限定时间。

下面来看看代码:

public class OCThreadExecutor extends ThreadPoolExecutor {

private Map runnableMap;

public OCThreadExecutor(int maxRunningThread, String poolName) {

super(maxRunningThread, maxRunningThread, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), new OCThreadFactory(poolName));

runnableMap = new HashMap<>();

}

以上是自定义线程池,带参的构造方法;

static class OCThreadFactory implements ThreadFactory {

private final String name;

public OCThreadFactory(String name) {

this.name = name;

}

public String getPoolName() {

return name;

}

@Override

public Thread newThread(@NonNull Runnable r) {

return new OCThread(r, name);

}

}

static class OCThread extends Thread {

public OCThread(Runnable runnable, String name) {

super(runnable, name);

setName(name);

}

@Override

public void run() {

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);

super.run();

}

}

实现线程工厂;

重点来了:

/**

* 执行任务

* @param task  任务对象

* @param tag   任务唯一TAG

*/

public void submit(FutureTask task , String tag){

synchronized (this){

//执行线程

if ( !runnableMap.containsKey(tag) ){

//如果池内没有相同的任务则可以执行

Log.d("OCThreadExecutor", "Task submitting TAG: "+tag);

runnableMap.put(tag, task);

submit(task);

}else{

Log.d("OCThreadExecutor", "Pool: "+((OCThreadFactory)getThreadFactory()).getPoolName()+" Same task TAG. Skipped. "+tag);

}

}

}

以上提交方法的tag值是为了唯一识别正在执行的线程,或者判断该线程有没有在执行。

如果没有将执行该任务,且添加进Map

下面是得到URL访问网络:

protected NetworkHelper() {

handler = new Handler(Looper.getMainLooper());

httpClient = new OkHttpClient();

threadExecutor = new OCThreadExecutor(1,"networkTHS");

}

public static NetworkHelper getInstance() {

if (networkHelper == null){

networkHelper = new NetworkHelper();

}

return networkHelper;

}

/**

* UI 线程

* @param runnable 在UI线程运行的任务

*/

private void runOnUIThread(@NonNull Runnable runnable){

boolean done = handler.post(runnable);

while (!done){

handler = new Handler(Looper.getMainLooper());

runOnUIThread(runnable);

}

}

任务在UI线程中运行,知道任务完成,这是最让我纠结的地方,但是在项目中有没有出现过问题,可能是我现在的访问量不大吧!!

下面是一个获取项目文章的线程方法:

/**

* 读取文章

* @param onArtcleLoadCallback  读取进度回调

* @param needToCacheImage  是否进行缓存图片网址以供主界面滚动显示

* @param args  附带的参数

*/

public void loadArtcles(@Nullable OnArtcleLoadCallback onArtcleLoadCallback ,@NonNull boolean needToCacheImage ,@NonNull String[] args){

threadExecutor.submit(new FutureTask<>(new GetArtclesThread(onArtcleLoadCallback, needToCacheImage, args)),GetArtclesThread.TAG+args[2]);

}

下载文章线程:

/**

* 获取文章以及缓存首页滚动图片的任务

*/

class GetArtclesThread implements Callable{

public static final String TAG = "GetArtclesThread";

private OnArtcleLoadCallback onArtcleLoadCallback;

private boolean needToCacheImage;

private ArrayList artcles = null;

private String[] args;

public GetArtclesThread(OnArtcleLoadCallback onArtcleLoadCallback, boolean needToCacheImage ,String[] args) {

this.onArtcleLoadCallback = onArtcleLoadCallback;

this.needToCacheImage = needToCacheImage;

this.args = args;

}

@Override

public String call() throws Exception {

//先检查OKHttp是否有效

if (httpClient == null){

httpClient = new OkHttpClient();

}

//如果参数数量大于等于4,则执行请求

if (args != null && args.length >= 4){

try {

artcles = requestData();

} catch (IOException e) {

Log.d(TAG, "Exception:"+e);

failed(null,e);

return null;

}

}else {

failed("无效的请求参数",null);

return null;

}

completed();

return null;

}

这是一个获取文章的任务,这个任务会在线程池中执行,在回调方法中会先执行请求文章,当获取文章完成之后才会去UI线程显示文章。

目前只知道这种方式,不知道大家有没有更好的方法?  求教

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

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

相关文章

python十进制转二进制循环_python十进制转二进制的详解

python十进制转二进制 python中十进制转二进制使用 bin() 函数。 bin() 返回一个整数 int 或者长整数 long int 的二进制表示。 下面是使用示例&#xff1a; >>>bin(10) 0b1010 >>> bin(20) 0b10100 补充&#xff1a;十进制转8进制和16进制的方法&#xff1a…

计算机主机硬件图片,电脑主机内部有哪些硬件

电脑主机内部有哪些硬件电脑主机里的硬件都有哪些呢&#xff0c;你知道吗?下面将由小编带大家来解答这个疑问吧&#xff0c;希望对大家有所收获!从主机外部看硬件从外边看&#xff0c;主机就是一个扁扁方方的铁盒子&#xff0c;但很多朋友确没有真正了解过它内部到底是什么样子…

springboot profile_SpringBoot简单配置

使用Spring Boot&#xff0c;配置工作将会变得更加简单&#xff0c;我们只需要在application.properties中定义属性&#xff0c;然后在代码中直接使用Value注入即可。 如下&#xff1a;book.authorxxxbook.nameyyy book.pinyin测试这里专门设置了中文&#xff0c;因为中文不做特…

cc9.3 indesign_InDesign2018mac中文版_Adobe InDesign CC 2018 for mac官方版 - 17软件下载

Adobe InDesign CC 2018 Mac简体中文版&#xff0c;版本号&#xff1a;V13.1.0.76&#xff0c;软件采用了全新的启动界面&#xff0c;更新和改进众多功能。并且支持多国语言版本&#xff1a;中文&#xff0c;英文&#xff0c;韩文&#xff0c;日本等多国语言。安装方法&#xf…

大工14秋《计算机应用基础》在线测试2,2017大工《计算机应用基础》在线测试2答案.doc...

大工17秋《计算机应用基础》在线测试2答案?1: 单选题 (4分)在Excel 2010中,存储数据的表格被称为()。A: 文件B: 文件夹C: 工作表D: 图表2: 单选题 (4分)在Excel 2010中,图表是()。A: 用户通过“绘图”工具栏的工具绘制的特殊图形B: 由数据清单生成的用于形象表现数据的图形C: …

druid jar包_使用druid实现Spring boot配置文件中数据库密码密文存储

通常在编写代码的时候&#xff0c;数据库的用户名和密码以明文的方法写到配置文件中&#xff0c;系统运维为了保证一定的安全性&#xff0c;要求我们在配置文件中使用密文的方式存储&#xff0c;本文主要介绍使用druid实现数据库密码密文显示的方法。一、基本情况druid包中Conf…

嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

嵌入式linux项目开发(一)——BOA移植项目目标&#xff1a;使用BOA、CGIC、SQLite搭建嵌入式web服务器一、嵌入式web服务器BOA简介在嵌入式设备的管理与交互中&#xff0c;基于Web方式的应用成为目前的主流&#xff0c;即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器&am…

html课做一个网页,菜鸟自学建站 HTML 第三课 制作我的第一个网页_html/css_WEB-ITnose...

上一课我们了解了Dreamweaver的工作界面&#xff0c;从这节课开始&#xff0c;我们由浅入深的开始学习网页的制作。首先打开Dreamweaver&#xff0c;制作网页首先要新建一个文档&#xff0c;就像我们写文稿需要一张纸一样。只有有了载体&#xff0c;你才能在上面进行创作&#…

k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?

Redis三种集群方式&#xff1a;主从复制、哨兵模式和Cluster模式一、主从复制模式Redis配置成主从模式&#xff0c;主库(Master)只负责客户端的写数据&#xff0c;从库(Slave)只负责客户端的读数据。主从数据复制过程如图所示&#xff1a;主从复制原理&#xff1a;slave redis连…

mock模拟接口测试 vue_Easy Mock以及Vue+Mock.js模拟数据

Easy Mock以及VueMock.js模拟数据一、Mock.js简介Mock.js是一个可以模拟后端数据&#xff0c;也可以模拟增删改查操作的js库基础语法规范数据模板中的每个属性由 3 部分构成&#xff1a;属性名、生成规则、属性值&#xff1a;name|rule: value语法规则说明name|min-max: string…

excel转html中文乱码,英文系统中Excel中文乱码问题

我是先用Gridview导出&#xff0c;然后再转换格式&#xff0c;部分代码如下StringWriter sw new StringWriter();HtmlTextWriter htw new HtmlTextWriter(sw);GV.RenderControl(htw);File.WriteAllText(path"temp", sw,System.Text.Encoding.UTF7);Excel.Applicati…

jsbridge原理_React Hooks 原理与最佳实践

1. 前言React Hooks 是 React 16.8 引入的新特性&#xff0c;允许我们在不使用 Class 的前提下使用 state 和其他特性。React Hooks 要解决的问题是状态共享&#xff0c;是继 render-props 和 higher-order components 之后的第三种状态逻辑复用方案&#xff0c;不会产生 JSX 嵌…

html小圆图堆叠轮播,每次移一张图片的无缝轮播图

my动画轮播图*{list-style: none;margin: 0px;padding: 0px;}.carousel{width: 530px;height: 280px;overflow: hidden;position: relative;}.carousel .imgList{width: 9999px;position: absolute;}.carousel .imgList>li{float: left;}.carousel .imgList>li>img{wi…

mfc绘制bezier b样条三种曲线_生存曲线(二):SPSS和Origin绘图教程及相关问题

上期生存分析推送后&#xff0c;有粉丝在后台问&#xff1a;有发生率的情况&#xff0c;为什么要做生存曲线分析&#xff1f;举个例子&#xff1a;临床试验中&#xff0c;共招募30位胃腺癌患者&#xff0c;均分为3组&#xff0c;分别使用了A/B/C三套不同的治疗方案&#xff0c;…

8位可控加减法电路设计_高级工程师:相同的地线GND,却有不同的电路设计含义...

问一个简单而又很难回答的电路问题&#xff1a;电路中的地线GND&#xff0c;它的本质是什么&#xff1f;工程师&#xff0c;在研发设计一个电路项目时&#xff0c;一般会经历三个阶段&#xff1a;电路项目PCBA板1&#xff0c;项目方案论证项目方案论证&#xff0c;是在项目前期…

word刷子刷格式_Excel技巧—开始菜单之格式刷六大功能

点赞再看&#xff0c;养成习惯千里之行&#xff0c;始于足下今天我们主要学习的是“第一区块-剪贴板”中的“格式刷”。“格式刷”主要将一个对象的颜色、字体样式、字体大小、边框样式等所有格式复制到目标对象上&#xff0c;我们可以把它理解为格式的复制粘贴。说到“格式刷”…

html/css题库,DIV+CSS题库

CD2、在CSS语言中下列哪一项是"左边框"的语法&#xff1f;(C )A、border-left-width:B、border-top-width:C、border-left:D、border-top-width:3. 选出你认为最合理的定义标题的方法( C )A. 文章标题B.文章标题C.文章标题D. 文章标题4、在CSS语言中下列哪一项的适用…

紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习试题试题(含答案解析)2...

一、选择题&#xff1a;(每题2分&#xff0c;共40分)1&#xff0e;在TCP/IP参考模型中&#xff0c;TCP协议工作在()。A、应用层B、传输层C、互联网层D、网络接口层2&#xff0e;下列()是合法的E-mail地址。A、mnetworkhttp://www.doczj.com/doc/fe7e6e475ebfc77da26925c52cc58b…

go语言和python结合_Go+Python双语言混合开发-第1章 【阶段一:Go语言基础】

1-1 GoPython双语言混合开发-课程导学 (11:35)1-2 课程资源获取方式 - 非常重要&#xff01;&#xff01;&#xff01; (06:07)1-3 课程中需要用到的开发环境介绍 (03:47)1-4 windows中安装centos7虚拟机 (19:16)1-5 xshell的安装和使用 (04:14)1-6 git的安装和配置 (06:22)1-7…

cwinthread*线程指针怎么销毁结束_最新版Web服务器项目详解 01 线程同步机制封装类...

点 击 关 注 上 方&#xff02;两猿社&#xff02;设 为&#xff02;置 顶 或 星 标&#xff02;&#xff0c;干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社基础知识RAIIRAII全称是“Resource Acquisition is Initialization”&#xff0c;直译过来是“资源获取即初始化”.…