首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[Xamarin][转载]工作线程(耗时操作)与UI线程实现异步更新

[Xamarin][转载]工作线程(耗时操作)与UI线程实现异步更新

作者头像
云未归来
发布2025-07-18 14:39:49
发布2025-07-18 14:39:49
850
举报

工作线程(耗时操作)与UI线程实现异步更新 概述:工作线程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线程。 本文章转载自:https://blog.csdn.net/yaonga/article/details/71216541

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档