工作线程(耗时操作)与UI线程实现异步更新
来源:互联网 发布:java如何安装与卸载 编辑:程序博客网 时间:2024/04/30 01:54
- 概述:工作线程A(多任务)执行期间,把单一任务的结果返回到UI线程更新。
- 实现: 创建基础流程类(两个handler)
public abstract class BaseQueueThread{ /** * 设置处理线程、ui处理流程,由子类实现 */ protected abstract Object doInWork(int integer);//耗时操作 protected abstract void doInUi(Object obj);//更新ui private Handler mWorkHandler,mUiHandler; private boolean isDestroy; private PriorityQueue<Message> mQueue;//优先队列 public BaseQueueThread() { initProcess(); } //暴露数据访问接口 public void sendMessage(int priority,Integer obj) { Message msg = Message.obtain(); msg.what = priority; msg.obj = obj; mWorkHandler.sendMessage(msg);//从工作线程开始 } private void initProcess() { mUiHandler = new Handler(Looper.getMainLooper()); HandlerThread handlerThread = new HandlerThread(getClass().getName()); handlerThread.start(); mWorkHandler = new Handler(handlerThread.getLooper()) { private boolean isWait;//是否在等待ui更新 @Override public void handleMessage(Message msg) { if(isDestroy) { return; } try { if(msg.what == -1) { if (mQueue == null) { isWait = false; return; } msg = mQueue.poll(); if (msg == null) { isWait = false; return; } }else if(isWait) { if (mQueue == null) { mQueue = new PriorityQueue<Message>(11, new Comparator<Message>() { @Override public int compare(Message lhs, Message rhs) { return rhs.what - lhs.what; } }); } Message message = Message.obtain(); message.copyFrom(msg); mQueue.add(message); return; }else { isWait = true; } final Object result = doInWork((Integer) msg.obj); mUiHandler.post(new Runnable() { @Override public void run() { doInUi(result); Message msg1 = Message.obtain(); msg1.what = -1;//通知ui更新成功 mWorkHandler.sendMessageAtFrontOfQueue(msg1); } }); } catch (Exception e) { isWait = false; e.printStackTrace(); } } }; } public void onDestroy() { isDestroy = true; if(mWorkHandler!=null) { mWorkHandler.removeCallbacksAndMessages(null); } if (mUiHandler!=null) { mUiHandler.removeCallbacksAndMessages(null); } }}
具体实现类:
public class EasyQueueThread extends BaseQueueThread{ private TextView mTextView; public EasyQueueThread(TextView textView) { super(); mTextView = textView; } @Override protected Object doInWork(int obj) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "ok"+obj; } @Override protected void doInUi(Object obj) { mTextView.setText((String)obj); }}
发送工作线程消息,逐步更新UI:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView bt = (TextView) findViewById(R.id.button1); EasyQueueThread easyQueueThread = new EasyQueueThread(bt); for (int i = 0;i< 10 ;i++) { easyQueueThread.sendMessage(i,i); } }}
3.总结:耗时操作不要放在UI线程,关键点要处理好什么时候执行工作线程,什么时候执行UI线程。
0 0
- 工作线程(耗时操作)与UI线程实现异步更新
- Thread+Handler异步执行耗时操作更新UI线程界面
- Android AsyncTask(异步耗时 更新UI)
- 开启线程异步更新UI
- Android中为什么主线程更新UI,子线程执行耗时操作?
- 工作线程中更新UI
- windows8开发-使用工作线程与更新UI
- UI与耗时操作
- winform UI后台异步工作线程封装
- Android异步机制更新UI线程(详解)
- winform异步线程更新UI问题
- C# 异步线程加载数据 更新UI
- 使用异步消息处理更新UI线程
- Xamarin.Android如何异步更新UI线程
- Winform线程通信(异步更新UI--SynchronizationContext
- xamarin android异步更新UI线程
- xamarin android异步更新UI线程
- 子线程实现UI更新
- linux 系统调用---ioctl
- 测试对于效率的提升都可以做些什么?
- 多播委托
- mssql单个用户与多个用户
- Android Canvas 绘图之 PorterDuffXfermode
- 工作线程(耗时操作)与UI线程实现异步更新
- 三星又推出新工具啦!Gear VR 可以兼容多个视频
- Android属性动画高阶用法-Interpolator,TypeEvaluatory以及贝塞尔曲线公式的使用
- java的第一天
- 判断一个矩阵中是否可以找到一条包含某个String的路径
- opencv(13)---图像滤波
- Xilinx ISE软件 模拟组合逻辑入门
- 基于IntelliJ IDEA开发Spark的Maven项目——Scala语言
- SpringBoot集成Mybatis