android 判断主线程_Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作...

前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行。

比如,一个加载网络图片的的方法,需要在子线程中执行。

/**

* 加载网络图片

*/

private void loadImage() {

try {

//用延时3秒操作来模拟网络操作

Thread.sleep( 3000 );

} catch (InterruptedException e) {

e.printStackTrace();

}

}

但是其他的同事在使用的时候,可能一不小心就在主线程中执行了 loadImage() 方法。这样就势必造成了界面卡顿。

为了避免这种情况,我们需要一个线程判断的工具 ThreadUtil来帮助我们处理。

当前线程是主线程,抛出异常,不去加载

当前线程是子线程,继续执行,完成加载

package com.app;

import android.os.Looper;

/**

* Created by ${zyj} on 2016/6/7.

*/

public class ThreadUtil {

/**

* Throws an {@link java.lang.IllegalArgumentException} if called on a thread other than the main thread.

*/

public static void assertMainThread() {

if (!isOnMainThread()) {

throw new IllegalArgumentException("You must call this method on the main thread");

}

}

/**

* Throws an {@link java.lang.IllegalArgumentException} if called on the main thread.

*/

public static void assertBackgroundThread() {

if (!isOnBackgroundThread()) {

throw new IllegalArgumentException("YOu must call this method on a background thread");

}

}

/**

* Returns {@code true} if called on the main thread, {@code false} otherwise.

*/

public static boolean isOnMainThread() {

return Looper.myLooper() == Looper.getMainLooper();

}

/**

* Returns {@code true} if called on the main thread, {@code false} otherwise.

*/

public static boolean isOnBackgroundThread() {

return !isOnMainThread();

}

}

然后我们把 loadImage() 修改一下,就成了

/**

* 加载网络图片

*/

private void loadImage() {

//判断是否在子线程。 子线程:继续执行 主线程:抛出异常

ThreadUtil.assertBackgroundThread();

try {

//用延时3秒操作来模拟网络操作

Thread.sleep( 3000 );

} catch (InterruptedException e) {

e.printStackTrace();

}

}

可以看到在 loadImage() 方法中多了一句: ThreadUtil.assertBackgroundThread();

在 assertBackgroundThread() 方法里,判断如果不是子线程就直接抛出 "YOu must call this method on a background thread"

正确的调用应该是:在子线程中调用 loadImage() ,比如:

new Thread(new Runnable() {

@Override

public void run() {

loadImage();

}

}).start();

总结:

ThreadUitl 是参考图片加载框架Glide写的 .

ThreadUtil.assertBackgroundThread();   要求在子线程中执行

ThreadUtil.assertMainThread() ;           要求在主线程运行

Handler主线程子线程之间的互相通信

Handler主线程子线程之间的互相通信 package com.wyl.dansnote; import android.app.Activity; import android.os.Bundle ...

Android 主线程和线程之间相互发送消息

通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带L ...

【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。

题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次 思路如下: 子线程语主线程为互斥,可用SYNCHRONIZED.很容易想 ...

Android Studio 2.0 Beta 5公布,修复几个与即时执行相关的严重BUG.

Android Studio 2.0 Beta 5公布,修复几个与即时执行相关的严重BUG. This build fixes a couple of important bugs related t ...

Android之Handler用法总结/安卓中只有主线程可以修改UI

Handler传递消息的方式可以实现实时刷新以及长按连续响应事件. 按钮响应 btnadd_fcl.setOnTouchListener(new View.OnTouchListener() { pr ...

【转载】Delphi7从子线程中发送消息到主线程触发事件执行

在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上 ...

用Handler的post()方法来传递线程中的代码段到主线程中执行

自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了.Handler的post()方法 ...

C#(WPF和WinForm)在普通类中调用到主线程的方法,SynchronizationContext的用法。

一.SynchronizationContext类用法: 1.对于WindowsFrom应用程序,如果想在某个类中,不方便使用到控件的Invoke方法时,可以使用WindowsBase.dll下的Sy ...

事件循环和线程没有必然关系(就像Windows子线程默认没有消息循环一样),模态对话框和事件循环也没有必然关系(QWidget直接就可以)

周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博 ...

随机推荐

python项目练习3:万能的XML

1.目的 如何用XML来表示多种数据,以及如何使用适合XML或SAX的简单API来处理XML文本.目标是通过一个描述各种网页和目录的XML文件生成一个完整的网站. 注:有关XML的描述参见http:/ ...

【字符串处理】HDOJ-1020-Encoding

[题目链接:HDOJ-1020] 相邻字符,两两比较. #include #include ; char sr[MAXN]; int main ...

$(document).ready()与window.onload的区别(转发)

1.执行时间window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行.$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.2.编写个数不同wind ...

MongoDB存储引擎选择

MongoDB存储引擎选择 MongoDB存储引擎构架 插件式存储引擎, MongoDB 3.0引入了插件式存储引擎API,为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化无疑参考了MyS ...

Golang 容器和不同header的解析

记录一下,用golang实现一个静态资源容器,膜拜下强人 http.Handle("/", http.FileServer(http.Dir(currentPath+"/ ...

小程序 input 键盘弹出时样式遮盖问题

设置cursor-spacing,具体可参考官方文档,代码如下:

2017-2018-2 《网络对抗技术》 20155322 Exp 5 MSF基础应用

[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-情报收集 2.2-主动攻击实践-ms08_067 2.3-浏览器攻击实践-many* ...

Golang报错mixture of field:value and value initializers

Golang 在使用匿名成员初始化时,如果出现 mixture of field:value and value initializers 是因为初始化的方式不对,见代码: package main ...

java 基础--switch--003

1,break可以省略吗? default中的可以省略,其他的如果省略会执行下一个case,从下一个case的 break中中断.(case穿透) 2,default一定要在最后吗? 不是,可以在任意 ...

通过网页发布ios应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值