实现RunOnUiThread和RunOnUiThreadBlock
现在需要实现一个工具类,RunUtils,这个类中包含runOnUiThread(Context context, Runnable runnable)和runOnUiThreadBlock(Context context, Runnable runnable)两个方法。两个方法都使runnable在UI线程执行,runOnUiThread立即返回,runOnUiThreadBlock等待runnable执行完毕后才返回。
根据context创建一个Handler,这个Handler用于发送消息。runOnUiThread这个方法不需要同步,runOnUiThreadBlock需要同步。
RunUtils内容
package com.letv.handlertest; import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log; import java.lang.ref.WeakReference; public class RunUtils { private static final int WHAT_BLOCK = 0x1001; private static WeakReference<Context> weakContext;
private static WeakReference<Handler> weakHandler;
private static Object lock = new Object(); private static void init(Context context){
if(RunUtils.weakContext == null ||
(RunUtils.weakContext!=null && RunUtils.weakContext.get()!=context) ){
RunUtils.weakContext = new WeakReference<Context>(context); Handler handler = new Handler(context.getMainLooper()) {
@Override
public void dispatchMessage(Message msg) {
if(msg.what == WHAT_BLOCK){
Log.i(MainActivity.TAG, "what block");
synchronized (lock){
super.dispatchMessage(msg);
lock.notify();
Log.i(MainActivity.TAG, "notify");
}
}
else{
super.dispatchMessage(msg);
Log.i(MainActivity.TAG, "what not block");
}
}
};
weakHandler = new WeakReference<Handler>(handler);
handler = null;
}
} public static void runOnUiThread(Context context, Runnable runnable){
init(context);
weakHandler.get().post(runnable);
Log.i(MainActivity.TAG, "run ui over!");
} public static void runOnUiThreadBlock(Context context, Runnable runnable){
init(context); Message msg = Message.obtain(weakHandler.get(), runnable);
msg.what = WHAT_BLOCK;
msg.sendToTarget(); synchronized (lock){
Log.i(MainActivity.TAG, "begin wait!");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(MainActivity.TAG, "run ui block over!");
}
} }
主类MainActivity内容
package com.letv.handlertest; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends Activity implements View.OnClickListener { public static final String TAG = "HandlerTest"; private Button btnRunOnUiThread, btnRunOnUiThreadBlock;
private TextView tvShow1, tvShow2;
// private RunUtilsB utils; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView(); // utils = new RunUtilsB(this);
} private void initView(){
btnRunOnUiThread = (Button)findViewById(R.id.btnRunOnUiThread);
btnRunOnUiThreadBlock = (Button)findViewById(R.id.btnRunOnUiThreadBlock);
tvShow1 = (TextView)findViewById(R.id.tvShow1);
tvShow2 = (TextView)findViewById(R.id.tvShow2); btnRunOnUiThread.setOnClickListener(this);
btnRunOnUiThreadBlock.setOnClickListener(this);
} private void runUi(){
new Thread(new Runnable() {
@Override
public void run() {
RunUtils.runOnUiThread(MainActivity.this, new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tvShow1.setText("run ui");
}
});
}
}).start();
} private void runUiBlock(){
new Thread(new Runnable() {
@Override
public void run() {
RunUtils.runOnUiThreadBlock(MainActivity.this, new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tvShow2.setText("run ui block");
}
});
}
}).start();
} @Override
public void onClick(View v) {
if(v == btnRunOnUiThread){
runUi();
}
else if(v == btnRunOnUiThreadBlock){
runUiBlock();
}
}
}
运行结果正常。点击RunOnUiThread实现2s后更新textView1的值,点击调用后立马返回,点击RunOnUiThreadBlock后实现2s后更新textView2的值,更新完后才返回。
实现RunOnUiThread和RunOnUiThreadBlock的更多相关文章
- android Activity runOnUiThread() 方法的使用
利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThr ...
- android Activity runOnUiThread() 方法使用
在android 中我们一般用 Handler 做主线程 和 子线程 之间的通信 . 现在有了一种更为简洁的写法,就是 Activity 里面的 runOnUiThread( Runnable )方法 ...
- 我的Android最佳实践之—— Android更新UI的两种方法:handler与runOnUiThread()
在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...
- Android更新UI的两种方法——handler与runOnUiThread()
在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...
- 使用runOnUiThread更新UI
android中更新UI的方式比较多,这里就不一一介绍了,比较常用的Thread+Handler,但是这种方式较繁琐,如在使用ProgressDialog创建进度对话框一文中就是使用的这种方式更新UI ...
- Android更新主线程UI的两种方式handler与runOnUiThread()
在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题.如果在主线程之外的线程中直接更新页面显示常会报错.抛 ...
- 理解Activity.runOnUiThread()
这是一篇译文(中英对照),原文链接:Understanding Activity.runOnUiThread() When developing Android applications we alw ...
- 19 子线程刷新UI runOnUiThread
package com.example.com.fmyh; import java.io.BufferedReader; import java.io.File; import java.io.Fil ...
- runOnUiThread更新主线程
更新UI采用Handle+Thread,需要发送消息,接受处理消息(在回调方法中处理),比较繁琐.除此之外,还可以使用runOnUiThread方法. 利用Activity.runOnUiThre ...
随机推荐
- Implemented Energy-Conserving Hair Scattering Model from Weta Digital
I used to implement the Energy-Conserving Hair Scattering Model as the pre-calculation program, so t ...
- AIOps 平台的误解,挑战及建议(中)— AIOps常见的误解
本文篇幅较长,分为上,中,下,三个部分进行连载.内容分别为:AIOps 背景/所应具备技术能力分析(上),AIOps 常见的误解(中),挑战及建议(下). 前言 我大概是 5,6 年前开始接触 ITO ...
- ThreadPoolExecutor源码解析(二)
1.ThreadPoolExcuter运行实例 首先我们先看如何新建一个ThreadPoolExecutor去运行线程.然后深入到源码中去看ThreadPoolExecutor里面使如何运作的. pu ...
- Python基于皮尔逊系数实现股票预测
# -*- coding: utf-8 -*- """ Created on Mon Dec 2 14:49:59 2018 @author: zhen "&q ...
- java笔记----面试题总结(一)【转】
1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...
- [20181226]简单探究cluster table.txt
[20181226]简单探究cluster table.txt --//简单探究cluster table.以前也做过,有点生疏了. 1.环境:SCOTT@book> @ ver1PORT_ST ...
- java.lang.NumberFormatException: Infinite or NaN
1.异常提示: java.lang.NumberFormatException: Infinite or NaN 2.原因:无法格式化的数字,此数字要么不是个数字,要么是无穷大的数字,从而导致 B ...
- linux源
系统:centos7 x86_64 一.配置本地yum源 1.1加载光驱 1.2挂载到系统 注:如果要长期使用最好把整个镜像文件拷贝到系统下 1.3配置文件 路径/etc/yum.repos.d/ 打 ...
- Lua无法排序的问题(Key需要是连续的)
排序的Key需要是连续的 local x = {[1]={x=6}, [2]={x=5}, [3]={x=7}, [5]={x=2}, [6]={x=8}, [7]={x=5}} ---从小到大排序 ...
- Debian9安装vim和vim无法右键鼠标粘贴解决方法
问题描述: Debian9有时候安装的时候没有vim,在centos用习惯了vim 1.Debian安装vim: root@kvm1:/etc/network# apt-get install vim ...