工作线程(耗时操作)与UI线程实现异步更新

xiaoxiao2021-02-28  118

概述:工作线程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://www.6miu.com/read-37556.html

最新回复(0)